要点
- 使用的是Winsock2库和windows库
- 总共两个程序,一个服务器程序,一个客户端程序
服务器
- 1.通过WSAStartup函数确认协议版本
- 2.通过socket函数创建服务器socket变量
- 3.设置服务器协议地址簇,通过声明一个sock_address_in变量,就是大写的SOCKADDR_IN变量,然后设置网络地址就是本地的局域网IP,再设置端口号
- 4.通过bind函数绑定第二步创建的socket和第三步设置的服务器协议地址簇变量
- 5.通过listen函数让socket变量监听,同时设置最大允许连接的客户端数量
- 6.连接和通信
- 这一步也就是多线程的核心部分
- 用for循环跑多个客户端线程,事先声明存储客户端的SOCKET数组,然后for循环内每次都用accept函数去接听服务器socket
- 然后通过CreateThread函数去创建一个线程,这个函数内给定的传入参数就是客户端通信的函数
- 客户端通信的函数内就是进行一个while(1)无限循环,然后用一个buf数组和当前这次循环的客户端socket变脸作为参数传给recv函数,这样服务器就能收到这个客户端发来的消息了,用buf数组存储,然后再打印出来,供其它客户端查看,达到模拟多个客户端聊天室通信的功能
- 然后因为这创建线程的操作是在for循环内的,所以有多少客户端就跑了几次for循环,实现多线程客户端和同一个服务端的聊天室通信
- 这里的通信是每个客户端将自己的消息发送给服务端,然后通过一起查看客户端打印的数据进行通信的
- 7.之后就是通过closesocket断开连接,还有WSACleanup清理协议版本信息
客户端和模拟聊天
- 然后客户端的做的事情就是比服务端少了绑定和监听,直接连接服务器就行了
- 然后模拟聊天的过程就是就是,先点开服务器的exe执行程序,再点开多个客户端程序的exe执行程序,每点一个客户端exe程序,在服务器窗口上就会显示已连接一个客户端,然后我们就可以在客户端exe窗口上输入文字,就会在服务器exe窗口上打印出来,当然事先要准备好足够多的客户端socket数组,不然超过最大连接客户端数就会出错。
1.对于socket编程accept方法是干嘛的(三次握手在什么地方、说服务器和客户端是怎么连接的、连接的关键过程)
- accept函数是用于接受客户端的请求的
- 连接的关键过程
- 首先是服务器调用listen进行监听
- 然后客户端调用connect来发送syn报文
- 之后服务器的协议栈负责三次握手的交互过程,建立连接。连接建立后,往listen队列中添加一个成功的连接,知道队列的最大长度
- 再然后服务器调用accept从listen队列中取出一条成功的tcp连接,listen队列中的连接个数就少一个,然后程序就可以看到自己与用户的通信
2.你知道epoll吗(注意读音!),能详细讲讲吗,以及它和select的区别
3.socket中recv函数的返回值及意义
- recv先等待socket的发送缓冲区中的数据被协议传送完毕,如果协议在传送socket的发送缓冲区中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR
- 如果socket的发送缓冲区中没有数据或者数据被协议成功发送完毕后,recv先检查套接字socket的接收缓冲区
- 如果接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。
- 当协议把数据接收完毕,rec函数就把socket的接收缓冲区中的数据copy到buffer中,注意:
- 协议收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把socket的接收缓冲区中的数据copy完。
- recv函数仅仅是copy数据,真正的接收数据是协议来完成的
- recv函数返回copy的字节数
- 如果recv在copy时出错,你们它返回SOCKET_ERROR
- 如果recv在等待协议接收数据时中断了,那么它返回0