使用C(或C++)语言编写网络通信模拟程序

  1、变量定义:

    (1)需要定义套接字类型变量,因为套接字存在于地址族中,可以将通过套接字通信的进程的公有特性综合在一起。套接字通常只与同一区域的套接字交换数据。Windows Sockets只支持AF_INET网络域,使用网际协议族通信的进程使用该域。因此只有将数据转换成Socket类型的数据才可以进行传输。

    (2)定义地址结构体,用于存储协议族、ip地址以及端口号。其中,在地址结构体sockaddr_in中的sin_family部分指代协议族,也用于存放协议族信息,这一项在socket编程中只能是AF_INET,地址结构体sockaddr_in中的sin_addr部分用于存储ip地址,而sin_port部分则用于存储端口号

    (3)定义双字节型数值Socket版本,这里必须要提及MAKEWORD函数,MAKEWORD函数的作用是将两个byte类型合并成一个双字节型,其中一个在高8位,另一个在低8位。将MAKEWORD函数合并成的双字节型值赋给双字节型数值sockVersion作为Socket版本。

    (4)定义WSADATA类型的值,用来存储返回的Sockets数据。WSADATA是一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。

 

  2、函数介绍:

    在server程序中:

  1. 服务启动函数start():
    1. 该函数用于启动服务器,若启动成功返回0,启动失败则返回-1。其中应用到了WSAStartup函数,作用是启动WSA,这个函数的第一个参数为程序请求使用的Socket版本,第二个参数为返回请求的版本信息,返回值为0时成功。
    2. Socket函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源,3个参数分别为协议族、套接字类型和协议。另外,将对应的值分别存储到地址结构体中专门存放协议族、ip地址以及端口号的sin_family、sin_addr和sin_port。
    3. 除此之外,start()函数中还用到了库函数bind(),bind函数的作用是把socket与协议、ip地址、端口号绑定起来,由于bind函数的返回值表示绑定操作是否成功(0表示成功, -1表示不成功),因此可以对bind函数用if语句判断。bind函数中的第一个参数是待绑定的套接字,第二个参数是标识绑定在哪个“地方”,第三个参数则是这个“地方”的占地大小                                                                                                                                                                 
    4. start函数中还用到了listen(),listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen函数的第一个参数表示被listen函数作用的套接字,第二个参数表示队列内核的上限。另外,listen函数返回值表示侦听是否成功(0表示成功, -1表示不成功),因此也可以对listen函数用if语句判断。

 

     2. 服务停止函数stop():

             该函数用于停止服务器,首先对startOK的值进行判断,若startOK的值已经被赋为0(服务器已经启动),则开         始关闭服务器。其中涉及到了closesocket函数,closesocket函数的作用和socket函数的作用相反,释放为套接字分         配的资源。而另一个用到的函数WSACleanup()则和WSAStartup函数的作用相反,终止对WSA的使用。

 

  1. 接收客户端连接函数acceptClient():
    1. 该函数用于接收客户端连接,其中涉及到的accept函数则用于接收客户端的请求,accept函数第一个参数是待连接的套接字,第二个参数是待连接地址结构体的“位置”,第三个参数则是地址指向“位置”的长度。
    2. 另外,inet_ntoa()为IP地址转换函数,用于把网络字节序IP转化点分十进制IP。而send()函数则用于发送数据,应用程序使用send函数向TCP连接的另一端发送数据,其中尤其需要注意的是send()函数的第四个参数,第四个参数为flags,一般置0。
    3. kbhit()函数是一个系统自带的库函数,用于判断键盘是否有按下,若键盘有按下则返回1,若键盘没有按下则返回0。
    4. acceptClient()函数中使用到的setsockopt()函数则用于套接口设置选项值,其中第一个参数是待设置的套接字,第二个参数表示选项定义的层次,第三个参数表示需设置的选项,其中SO_RCVTIMEO指超时时间,第四个参数表示指向存放选项值的缓冲区的指针,第五个参数则表示缓冲区长度,也就是int类型的长度。
    5. recv函数用于接收客户端的数据,其中需要注意的是它的第三个参数表示缓冲区长度,也就是最长能接收的缓冲数据量,第四个参数send()函数相同,意思也是为flags,一般也置0 。

 

  1. 菜单函数menu():                                                                                                                                                          仅仅用于输出菜单。
  2. 主函数main():                                                                                                                                                              使用while(1)来执行无限循环,并输出菜单。根据输入的值不断调用之前的那几个函数,当输入5时,执行exit(0)退出。

在client程序中:

  1. 连接服务器函数connectServer():
    1. 该函数用于连接服务器,若启动成功返回0,启动失败则返回-1。其中应用到了WSAStartup函数,作用是启动WSA,这个函数的第一个参数为程序请求使用的Socket版本,第二个参数为返回请求的版本信息,返回值为0时成功。
    2. Socket函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源,3个参数分别为协议族、套接字类型和协议。另外,将对应的值分别存储到地址结构体中专门存放协议族、ip地址以及端口号的sin_family、sin_addr和sin_port。
    3. 除此之外,connectServer()函数中还用到了库函数connect(),connect函数用于连接服务器,其中第一个参数是客户端的套接字,第二个参数是服务端的套接字所在的“地方”,第三个参数是该“地方”的大小,如果请求连接成功,则返回0,否则返回错误码。                                              
    4. connectServer函数中还用到了inet_ntoa函数,inet_ntoa()为IP地址转换函数,用于把网络字节序IP转化点分十进制IP。

 

  1. 服务器对话函数ChatWithServer():
    1. ChatWithServer函数中用到了kbhit函数,kbhit()函数是一个系统自带的库函数,用于判断键盘是否有按下,若键盘有按下则返回1,若键盘没有按下则返回0。
    2. 其中通过判断connectOK的值来判断服务器是否已经连接,若connectOK的值为0则表示已经与服务器连接,可以进行接下来的对话步骤。
    3. buf缓冲区变量存放着要发送的数据,用gets函数来读字符串。首先用系统自带函数kbhit(),来判断键盘是否有按下,与之前相同,若键盘有按下,则读取缓冲区中要发送的数据,并调用send()函数。应用程序使用send函数向TCP连接的另一端发送数据。
    4. 对输入的数据进行判断,若输入的数据为"bye"、"再见"或者是"quit",则调用清屏函数,并输出菜单和停止函数。
    5. 设置recv的超时时间,超时则返回,不等待。这需要用到setsockopt函数,setsockopt()函数用于套接口设置选项值,它的第一个参数是待设置的套接字,第二个参数表示选项定义的层次,第三个参数表示需设置的选项,其中SO_RCVTIMEO指超时时间,第四个参数表示指向存放选项值的缓冲区的指针,第五个参数则表示缓冲区长度,也就是int类型的长度。
    6. 另外,还用到了recv(),recv函数用于接收客户端的数据,其中需要注意的是它的第三个参数表示缓冲区长度,也就是最长能接收的缓冲数据量,第四个参数send()函数相同,意思也是为flags,一般也置0 。
    7. 最后,用if进行判断,如果接收到的数据长度>0,则输出recvBuf[]中的数据并显示。对接收到的数据进行判断,若接收到的数据为"bye"、"再见"或者是"quit",则调用清屏函数,并输出菜单和停止函数。

 

  1. 客户端停止函数stop():
    1. 该函数用于停止客户端,首先对sockClient的值进行判断,若sockClient的值为1(客户端已经启动),则开始关闭客户端。其中涉及到了closesocket函数,closesocket函数的作用和socket函数的作用相反,释放为套接字分配的资源。
    2. 而另一个用到的函数WSACleanup()则和WSAStartup函数的作用相反,终止对WSA的使用。
本书是一本介绍利用Visual C++进行网络通信程序开发的书籍,书中精选了大量网络实例,涵盖了本地计算机网络编程,局域网网络通信编程,IE编程,网络通信协议编程,串口通信编程,代理服务器编程和高级网络通信编程。每个工程实例都提供了完整的源代码,读者可以很容易地根据需要进行二次开发。本书适合进行网络通信开发的人员阅读,同时也可以作为科研单位,高校相关专业人员的参考书籍。<br><br>目录介绍<br>第1章 Visual C++网络通信编程基础 1<br>1.1 Winsock1.1编程技术 1<br>1.1.1 Winsock的基本概念 1<br>1.1.2 Winsock的编程特点 2<br>1.1.3 Winsock基本的API 2<br>1.1.4 Winsock的异步模式 7<br>1.1.5 面向连接协议和无连接协议 20<br>1.2 Winsock 2.0编程技术 21<br>1.2.1 Winsock 2.0技术说明 21<br>1.2.2 Winsock 2.0新增函数 25<br>1.2.3 Winsock网络程序——聊天室 26<br>1.3 CAsyncSocket编程技术 38<br>1.3.1 CAsyncSocket类的组成 38<br>1.3.2 CAsyncSocket编程模型 39<br>1.4 CSocket编程技术 41<br>1.4.1 CSocket类的组成 42<br>1.4.2 CSocket应用实例——聊天室 43<br>1.5 WinInet编程技术 52<br><br>第2章 本地计算机网络编程 57<br>2.1 获取计算机的名称和IP地址 57<br>2.2 获取计算机的子网掩码 60<br>2.3 获取计算机的DNS设置 62<br>2.4 获取计算机的网卡地址 63<br>2.5 获取计算机安装的协议 65<br>2.6 获取计算机提供的服务 67<br>2.7 获取计算机的所有网络资源 69<br>2.8 修改本地计算机的网络设置 70<br>2.9 获取计算机TCP/IP的所有信息 74<br><br>第3章 局域网网络通信编程实例 79<br>3.1 获取网上邻居 79<br>3.1.1 实现原理 80<br>3.1.2 实例实现 83<br>3.2 IP地址和主机名之间的转换 87<br>3.2.1 实现原理 87<br>3.2.2 实例实现 89<br>3.3 映射网络驱动器 93<br>3.3.1 实现原理 93<br>3.3.2 实例实现 95<br>3.4 局域网消息发送程序Net Send 97<br>3.4.1 实现原理 98<br>3.4.2 实例实现 101<br>3.5 获取局域网内其他计算机的信息 103<br><br>第4章 IE编程实例 111<br>4.1 简单的浏览器的实现 111<br>4.1.1 实现原理 111<br>4.1.2 实例实现 112<br>4.2 删除IE相关历史记录 116<br>4.2.1 实现原理 116<br>4.2.2 实例实现 117<br>4.3 将应用程序加入到IE工具栏 121<br>4.3.1 实现原理 122<br>4.3.2 实例实现 123<br>4.4 超级链接的实现 127<br>4.4.1 实现原理 127<br>4.4.2 实例实现 128<br>4.5 禁止IE的弹出窗口 132<br>4.5.1 实现原理 132<br>4.5.2 实例实现 133<br>4.6 禁止浏览某些网站 139<br>4.6.1 实现原理 139<br>4.6.2 实例实现 139<br>4.7 IE收藏夹 142<br>4.7.1 实现原理 142<br>4.7.2 实例实现 142<br>4.8 设置桌面快捷方式和活动桌面 145<br>4.8.1 实现原理 145<br>4.8.2 实例实现 146<br><br>第5章 基本网络编程实例 150<br>5.1 点对点文件传输 150<br>5.2 端口扫描程序 155<br>5.2.1 实现原理 155<br>5.2.2 实例实现 155<br>5.3 Finger编程 161<br>5.3.1 实现原理 162<br>5.3.2 实例实现 164<br>5.4 Sniff编程 166<br>5.4.1 实现原理 166<br>5.4.2 实例实现 167<br>5.5 Internet文件下载 178<br>5.5.1 实现原理 178<br>5.5.2 实例实现 180<br><br>第6章 网络通信协议编程实例 184<br>6.1 FTP协议 185<br>6.1.1 FTP工作原理 185<br>6.1.2 FTP数据表示 186<br>6.1.3 FTP命令 187<br>6.1.4 FTP应答 192<br>6.1.5 FTP客户端实例方法 194<br>6.1.6 FTP客户端实例实现 201<br>6.2 SMTP协议 221<br>6.2.1 SMTP会话 221<br>6.2.2 SMTP信件 225<br>6.2.3 SMTP客户端实例方法 232<br>6.2.4 SMTP客户端实例实现 233<br>6.3 POP3协议 259<br>6.3.1 POP3会话 259<br>6.3.2 POP3信件 264<br>6.3.3 POP3客户端实例方法 268<br>6.3.4 POP3客户端实例实现 268<br>6.4 ICMP协议 287<br>6.4.1 ICMP报文格式 287<br>6.4.2 ICMP时间戳请求与应答 289<br>6.4.3 Ping程序的实现 291<br>6.4.4 TraceRoute程序的实现 300<br>6.5 Telnet协议 308<br>6.5.1 Telnet协议 308<br>6.5.2 NVT ASCII字符集 309<br>6.5.3 协商选项 309<br>6.5.4 BBS实例实现 310<br>6.6 HTTP协议 323<br>6.6.1 HTTP会话 324<br>6.6.2 HTTP数据 329<br>6.6.3 HTTP客户端程序的实现 329<br>6.6.4 HTTP服务器实例实现 343<br><br>第7章 Modem/串口通信编程实例 353<br>7.1 AT命令 353<br>7.1.1 Modem状态 353<br>7.1.2 AT命令 354<br>7.1.3 Modem返回信息码 354<br>7.2 MSCOMM控件编程实例 355<br>7.2.1 实现原理 355<br>7.2.2 实例实现 356<br>7.3 串口通信API编程实例 360<br>7.3.1 打开和关闭串口 360<br>7.3.2 串口配置 362<br>7.3.3 串口属性设置 365<br>7.3.4 缓冲区控制 366<br>7.3.5 串口读写 367<br>7.3.6 通信事件 369<br>7.3.7 设备控制命令 370<br>7.3.8 实例实现 370<br><br>第8章 代理服务器编程实例 378<br>8.1 Socks 5协议编程 379<br>8.1.1 实例原理 386<br>8.1.2 实例实现 388<br>8.2 HTTP代理服务器实例 397<br>8.2.1 主框架代码分析 397<br>8.2.2 代理类CProxyServer的实现 399<br><br>第9章 高级实例解析 409<br>9.1 串口通信高级编程实例 409<br>9.1.1 主程序结构和流程 409<br>9.1.2 实例演示 409<br>9.1.3 实例原理 410<br>9.1.4 实例设计 414<br>9.1.5 代码分析 414<br>9.2 网络流量监控实例 425<br>9.2.1 主程序结构和流程 426<br>9.2.2 实例演示 426<br>9.2.3 实例原理 426<br>9.2.4 实例设计 428<br>9.2.5 代码分析 429<br>9.3 网站下载实例 438<br>9.3.1 主程序结构和流程 438<br>9.3.2 实例演示 438<br>9.3.3 实例原理 439<br>9.3.4 实例设计 441<br>9.3.5 代码分析 442<br>9.4 网络五子棋实例 458<br>9.4.1 主程序结构和流程 458<br>9.4.2 实例演示 458<br>9.4.3 实例原理 459<br>9.4.4 实例设计 459<br>9.4.5 代码分析 459<br>9.5 语音聊天实例 466<br>9.5.1 主程序结构和流程 467<br>9.5.2 实例演示 467<br>9.5.3 实例原理 468<br>9.5.4 实例设计 472<br>9.5.5 代码分析 473<br>9.6 远程控制实例 482<br>9.6.1 主程序结构和流程 482<br>9.6.2 实例演示 483<br>9.6.3 实例原理 484<br>9.6.4 实例设计 485<br>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值