socket 服務器端和客戶端通信,面向TCP的
服務器端步驟:
1、創建用於監聽的套接字(socket)
2、將套接字綁定到本地地址和端口上(bind)
3、將套接字設為監聽模式(listen)
4、等待客戶請求(accept),此處要不斷的調用accept
5、通信(send/receive),完成后返回4
6、關閉套接字(closesocket)
客戶端步驟:
1、創建套接字
2、向服務器發送連接請求(connect)
3、通信(send/recv)
4、關閉套接字
程序代碼:
服務器端:
#include <WinSock2.h> #include <stdio.h> #pragma comment(lib,"Ws2_32.lib.") void main() { /* 加載套接字庫 */ WORD wVersionRequested; // 所使用套接字的版本號 WSADATA wsaData; // 存儲套接字版本的有關信息 int err; wVersionRequested = MAKEWORD(1,1); // 請求版本號,高位和低位字節均為1 err = WSAStartup(wVersionRequested,&wsaData); // 加載套接字 if(err != 0) { return; } if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); //如果高位或低位字節不為1終止對套接字的使用 return; } /* 創建用於監聽的套接字 */ SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); // 創建套接字,流式套接字,第三個參數設為0則自動選擇合適的協議 /* 綁定套接字 */ SOCKADDR_IN addrSrv; // 服務器地址信息,使用SOCKADDR_IN 代替SOCKETADD, 結構體的大小相等,可強制轉換 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(600); // 使用htons函數轉換為網絡字節序 bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)); // 將監聽套接字綁定到本地地址和端口上 listen(sockSrv,5); // 監聽 /* 等待客戶到來並接收發送數據 */ SOCKADDR_IN addrClient; // 接收客戶地址信息緩沖區 int len=sizeof(SOCKADDR); while(1){ SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 等待接收客戶連接請求,並返回連接套接字,利用這個套接字實現通信 char sendBuf[100]; sprintf(sendBuf,"Welcome %s to www.cnblogs.com/xiao-cheng", inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); // 發送數據,多加一個長度是字符串結束符 char recvBuf[100]; recv(sockConn,recvBuf,100,0); // 接收數據 printf("%s\n",recvBuf); closesocket(sockConn); } }
客戶端:
#include <WinSock2.h> #include <stdio.h> #pragma comment(lib,"Ws2_32.lib.") void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if (err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){ WSACleanup(); return; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; // 服務器地址信息 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(600); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); // 向服務器發送連接請求 char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); send(sockClient,"Request",strlen("Request")+1,0); closesocket(sockClient); WSACleanup(); }