一、客户端操作流程
1.1 加载套接字库(WSAStartup())
1.2创建套接字(socket())。
1.3向服务器发出连接请求(connect())。
对于客户端来说,它不需要绑定,可以直接连接服务器。这可以通过调用connect函数与服务器建立一个连接。其函数原型如下:
int connect(SOCKET s, const struct Sockaddr FAR* name , int namelen);
参数:
a) s:客户端用于首发数据的套接字。
b) name:指定网路主机的IP地址和端口信息。
c) namelen:第二个参数的长度。
想要与服务器建立连接,首先需要定义一个地址结构体(SOCKADDR_IN)变量,并对其成员进行赋值,设定服务端的IP地址和端口号,这里的端口需要与服务器使用的端口保存一致,而且使用网路字节顺序。
1.4 和服务器端进行通信(接受和发送信息(send()/recv()))
1.5 关闭套接字 (closesocket()/WSACleanup())
二、客户端实例
1 #include<winsock2.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 WORD wVersion; 7 WSADATA wsaData; 8 int er; 9 //1.初始化版本 10 wVersion = MAKEWORD(1,1); 11 //加载套接字库 12 er = WSAStartup(wVersion,&wsaData); 13 if (er!=0) 14 { 15 return -1; 16 } 17 //检测套接字 18 if (LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) 19 { 20 return -2; 21 } 22 23 //2.创建套接字 24 SOCKET sock = socket(AF_INET,SOCK_STREAM,0); 25 //3.连接服务器 26 SOCKADDR_IN addr_in; 27 addr_in.sin_family = AF_INET; 28 addr_in.sin_port = htons(7000); 29 addr_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 30 connect(sock,(sockaddr*)&addr_in,sizeof(addr_in)); 31 //4.发送或者接受数据 32 char recvBuf[1024]; 33 recv(sock,recvBuf,strlen(recvBuf)+1,0); 34 cout << "接受到服务器数据:" << endl; 35 char sendBuf[]="window socket 程序测试"; 36 send(sock,sendBuf,sizeof(sendBuf),0); 37 //5.关闭套接字 38 closesocket(sock); 39 WSACleanup(); 40 system("pause"); 41 return 0; 42 }
三、TCP/IP工作原理图