1.TCP的客户端代码流程简述
这一章将为大家讲解Socket通信中客户端的实现过程,还是先上图,请大家了解客户端的步骤
可以看到,相比服务端,客户端的步骤简单的很多。事实上这种情况比较多,比如一个服务端会有多个客户端连接。
通过图片我们可以看到TCP客务端调用的函数依次是socket( )、connect( )、recv( )、send( )、closessocket( )
由于在服务端这章的讲解中我们提到了socket()、recv()、send()、closesocket()、WSAStartup()、WSACleanup()的函数,在客户端中同样需要这些函数,使用方式是一样的,因此这里不再赘述。
大家学习前面的函数后可直接在客户端中实现。
2.Socket编程之connect函数
这一节我们讲connect连接,这一步位于客户端的第二步,调用connect阻塞客户程序,传输层实体开始建立连接,当连接建立完成时,取消阻塞;
函数功能:
向服务端发起连接请求
头文件:
#include <winsock2.h>
函数原型:
int connect(int sockcd, const struct sockaddr *addr, int addrlen);
返回值类型:
整型
返回值:
成功返回0,失败返回-1。当客户端调用 connect()函数之后,发生以下情况之一才会返回(完成函数调用)
- 服务器端接收连接请求
- 发生断网的异常情况而终端连接请求
参数说明:
sockcd为客户端建立socket函数的返回值。
addr是一个sockaddr结构的指针,用于指定所要连接的服务器的地址(服务端的IP地址和端口号,要和服务端的实际IP地址以及绑定的端口一致才可以)。
addrlen为addr变量的大小,可由 sizeof()计算得出。
调用connect函数整体代码的实现:
accept()函数,其实是服务器端把连接请求信息记录到等待队列。因此connect()函数返回后并不进行数据交换。而是要等服务器端 accept 之后才能进行数据交换。、
这一步调用完成之后,就和服务端建立了通信,就可以使用send或recv相互发送和接收消息了
connect(sockcd,(sockaddr*)&seraddr,sizeof(seraddr));//需要注意的是,所谓的“接收连接”并不意味着服务器调用
3.Socket客户端完整参考代码
本代码用于和第二章服务端代码一致,监听12345端口,可以不断的发送消息,直至输入"quit"退出程序,完整参考代码如下:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
int err;
char SendBuf[100];
WORD versionRequired;
WSADATA wsaData;
versionRequired=MAKEWORD(2,2);
err=WSAStartup(versionRequired,&w