一、TCP通信流程

1 #include "../common/InitSock.h" 2 #include <stdio.h> 3 CInitSock initSock; // 初始化Winsock库 4 int main() 5 { 6 // 创建套接字 7 SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 8 if(sListen == INVALID_SOCKET) 9 { 10 printf("Failed socket() "); 11 return 0; 12 } 13 // 填充sockaddr_in 结构 14 sockaddr_in sin; 15 sin.sin_family = AF_INET; 16 sin.sin_port = htons(4567); 17 sin.sin_addr.S_un.S_addr = INADDR_ANY; 18 // 绑定这个套接字到一个本地地址 19 if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) 20 { 21 printf("Failed bind() "); 22 return 0; 23 } 24 // 进入监听模式 25 if(::listen(sListen, 2) == SOCKET_ERROR) 26 { 27 printf("Failed listen() "); 28 return 0; 29 } 30 // 循环接受客户的连接请求 31 sockaddr_in remoteAddr; 32 int nAddrLen = sizeof(remoteAddr); 33 SOCKET sClient; 34 char szText[] = " TCP Server Demo! "; 35 while(TRUE) 36 { // 接受新连接 37 sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); 38 if(sClient == INVALID_SOCKET) 39 { 40 printf("Failed accept()"); 41 continue; 42 } 43 printf(" 接受到一个连接:%s ", inet_ntoa(remoteAddr.sin_addr)); 44 // 向客户端发送数据 45 ::send(sClient, szText, strlen(szText), 0); 46 // 关闭同客户端的连接 47 ::closesocket(sClient); 48 } 49 // 关闭监听套接字 50 ::closesocket(sListen); 51 return 0; 52 }

1 #include "../common/InitSock.h" 2 #include <stdio.h> 3 CInitSock initSock; // 初始化Winsock库 4 int main() 5 { 6 // 创建套接字 7 SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 8 if(s == INVALID_SOCKET) 9 { 10 printf("Failed socket() "); 11 return 0; 12 } 13 14 // 也可以在这里调用bind 函数绑定一个本地地址 15 // 否则系统将会自动安排 16 ... 17 // 填写远程地址信息 18 sockaddr_in servAddr; 19 servAddr.sin_family = AF_INET; 20 servAddr.sin_port = htons(4567); 21 // 注意,这里要填写服务器程序(TCPServer 程序)所在机器的IP地址 22 // 如果你的计算机没有联网,直接使用127.0.0.1即可 23 servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 24 if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) 25 { 26 printf("Failed connect() "); 27 return 0; 28 } 29 // 接收数据 30 char buff[256]; 31 int nRecv = ::recv(s, buff, 256, 0); 32 if(nRecv > 0) 33 { 34 buff[nRecv] = '