TCP Socket编程示例
TCP_Server
1 #include <winsock2.h> 2 #include <stdio.h> 3 #include <windows.h> 4 #pragma comment(lib,"ws2_32.lib") 5 6 int main(int argc, char* argv[]) 7 { 8 //判断是否输入了端口号 9 if(argc!=2) 10 { 11 printf("Usage: %s PortNumber\n",argv[0]); 12 exit(-1); 13 } 14 15 //把端口号转化成整数 16 short port; 17 if((port = ato(argv[1]))==0) 18 { 19 printf("端口号有误!"); 20 exit(-1); 21 } 22 WSADATA wsa; 23 //初始化套接字DLL 24 if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) 25 { 26 printf("套接字初始化失败!"); 27 exit(-1); 28 } 29 //创建套接字 30 SOCKET serverSocket; 31 if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET) 32 { 33 printf("创建套接字失败!"); 34 exit(-1); 35 } 36 37 struct sockaddr_in serverAddress; 38 memset(&serverAddress,0,sizeof(sockaddr_in)); 39 serverAddress.sin_family=AF_INET; 40 serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 41 serverAddress.sin_port = htons(port); 42 //绑定 43 if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR) 44 { 45 printf("套接字绑定到端口失败!端口: %d\n",port); 46 exit(-1); 47 } 48 //进入侦听状态 49 if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR) 50 { 51 printf("侦听失败!"); 52 exit(-1); 53 } 54 printf("Server %d is listening......\n",port); 55 SOCKET clientSocket;//用来和客户端通信的套接字 56 struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址 57 memset(&clientAddress,0,sizeof(clientAddress)); 58 int addrlen = sizeof(clientAddress); 59 //接受连接 60 if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET) 61 { 62 printf("接受客户端连接失败!"); 63 exit(-1); 64 } 65 printf("Accept connection from %s\n",inet_ntoa(clientAddress.sin_addr)); 66 char buf[4096]; 67 while(1) 68 { 69 //接收数据 70 int bytes; 71 if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR) 72 { 73 printf("接收数据失败!\n"); 74 exit(-1); 75 } 76 buf[bytes]='\0'; 77 printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf); 78 if(send(clientSocket,buf,bytes,0)==SOCKET_ERROR) 79 { 80 printf("发送数据失败!"); 81 exit(-1); 82 } 83 84 } 85 //清理套接字占用的资源 86 WSACleanup(); 87 return 0; 88 }
TCP_Client
1 #include <winsock2.h> 2 #include <stdio.h> 3 #include <windows.h> 4 #include <stdlib.h> 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char* argv[]) 8 { 9 //判断是否输入了IP地址和端口号 10 if(argc!=3) 11 { 12 printf("Usage: %s IPAddress PortNumber\n",argv[0]); 13 exit(-1); 14 } 15 //把字符串的IP地址转化为u_long 16 unsigned long ip; 17 if((ip=inet_addr(argv[1]))==INADDR_NONE) 18 { 19 printf("不合法的IP地址:%s",argv[1]); 20 exit(-1); 21 } 22 //把端口号转化成整数 23 short port; 24 if((port = atoi(argv[2]))==0) 25 { 26 printf("端口号有误!"); 27 exit(-1); 28 } 29 printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port); 30 WSADATA wsa; 31 //初始化套接字DLL 32 if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) 33 { 34 printf("套接字初始化失败!"); 35 exit(-1); 36 } 37 //创建套接字 38 SOCKET sock; 39 if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)//创建数据流用于TCP 40 { 41 printf("创建套接字失败!"); 42 exit(-1); 43 } 44 struct sockaddr_in serverAddress; 45 memset(&serverAddress,0,sizeof(sockaddr_in)); 46 serverAddress.sin_family=AF_INET; 47 serverAddress.sin_addr.S_un.S_addr = ip; 48 serverAddress.sin_port = htons(port); 49 //建立和服务器的连接 50 if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR) 51 { 52 printf("建立连接失败!"); 53 exit(-1); 54 } 55 char buf[4096]; 56 while(1) 57 { 58 printf(">"); 59 //从控制台读取一行数据 60 gets(buf); 61 //发送给服务器 62 if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR) 63 { 64 printf("发送数据失败!"); 65 exit(-1); 66 } 67 int bytes; 68 if((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR) 69 { 70 printf("接收数据失败!\n"); 71 exit(-1); 72 } 73 buf[bytes]='\0'; 74 printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf); 75 76 } 77 //清理套接字占用的资源 78 WSACleanup(); 79 system("pause"); 80 return 0; 81 82 }