Windows下Socket編程主要包括以下幾部分:
服務端
1、初始化Windows Socket庫。
2、創建Socket。
3、綁定Socket。
4、監聽。
5、Accept。
6、接收、發送數據。
客戶端
1、初始化Windows Socket庫。
2、創建Socket。
3、連接Socket。
4、接收、發送數據。
服務端每接收到一個客戶端的Socket,則創建一個線程。滿足一個服務端連接多個客戶端。
1 //Server.cpp 2 #include <iostream> 3 #include <winsock2.h> 4 5 using namespace std; 6 7 #pragma comment(lib, "ws2_32.lib") 8 9 #define PORT 4000 10 #define IP_ADDRESS "10.241.39.19" 11 12 13 DWORD WINAPI ClientThread(LPVOID lpParameter) 14 { 15 SOCKET CientSocket = (SOCKET)lpParameter; 16 int Ret = 0; 17 char RecvBuffer[MAX_PATH]; 18 19 while ( true ) 20 { 21 memset(RecvBuffer, 0x00, sizeof(RecvBuffer)); 22 Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0); 23 if ( Ret == 0 || Ret == SOCKET_ERROR ) 24 { 25 cout<<"客戶端退出!"<<endl; 26 break; 27 } 28 cout<<"接收到客戶信息為:"<<RecvBuffer<<endl; 29 } 30 31 return 0; 32 } 33 34 int main(int argc, char* argv[]) 35 { 36 WSADATA Ws; 37 SOCKET ServerSocket, ClientSocket; 38 struct sockaddr_in LocalAddr, ClientAddr; 39 int Ret = 0; 40 int AddrLen = 0; 41 HANDLE hThread = NULL; 42 43 //Init Windows Socket 44 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ) 45 { 46 cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl; 47 return -1; 48 } 49 50 //Create Socket 51 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 52 if ( ServerSocket == INVALID_SOCKET ) 53 { 54 cout<<"Create Socket Failed::"<<GetLastError()<<endl; 55 return -1; 56 } 57 58 LocalAddr.sin_family = AF_INET; 59 LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); 60 LocalAddr.sin_port = htons(PORT); 61 memset(LocalAddr.sin_zero, 0x00, 8); 62 63 //Bind Socket 64 Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr)); 65 if ( Ret != 0 ) 66 { 67 cout<<"Bind Socket Failed::"<<GetLastError()<<endl; 68 return -1; 69 } 70 //listen 71 Ret = listen(ServerSocket, 10); 72 if ( Ret != 0 ) 73 { 74 cout<<"listen Socket Failed::"<<GetLastError()<<endl; 75 return -1; 76 } 77 78 cout<<"服務端已經啟動"<<endl; 79 80 while ( true ) 81 { 82 AddrLen = sizeof(ClientAddr); 83 ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen); 84 if ( ClientSocket == INVALID_SOCKET ) 85 { 86 cout<<"Accept Failed::"<<GetLastError()<<endl; 87 break; 88 } 89 90 cout<<"客戶端連接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl; 91 92 hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)ClientSocket, 0, NULL); 93 if ( hThread == NULL ) 94 { 95 cout<<"Create Thread Failed!"<<endl; 96 break; 97 } 98 99 CloseHandle(hThread); 100 } 101 102 closesocket(ServerSocket); 103 closesocket(ClientSocket); 104 WSACleanup(); 105 106 return 0; 107 }
1 // Client.cpp 2 #include <iostream> 3 #include <winsock2.h> 4 5 using namespace std; 6 7 #pragma comment(lib, "ws2_32.lib") 8 9 #define PORT 4000 10 #define IP_ADDRESS "10.241.39.19" 11 12 int main(int argc, char * argv[]) 13 { 14 WSADATA Ws; 15 SOCKET ClientSocket; 16 struct sockaddr_in ServerAddr; 17 int Ret = 0; 18 int AddrLen = 0; 19 HANDLE hThread = NULL; 20 char SendBuffer[MAX_PATH]; 21 22 //Init Windows Socket 23 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ) 24 { 25 cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl; 26 return -1; 27 } 28 //Create Socket 29 ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 30 if ( ClientSocket == INVALID_SOCKET ) 31 { 32 cout<<"Create Socket Failed::"<<GetLastError()<<endl; 33 return -1; 34 } 35 36 ServerAddr.sin_family = AF_INET; 37 ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); 38 ServerAddr.sin_port = htons(PORT); 39 memset(ServerAddr.sin_zero, 0x00, 8); 40 41 Ret = connect(ClientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr)); 42 if ( Ret == SOCKET_ERROR ) 43 { 44 cout<<"Connect Error::"<<GetLastError()<<endl; 45 return -1; 46 } 47 else 48 { 49 cout<<"連接成功!"<<endl; 50 } 51 52 while ( true ) 53 { 54 cin.getline(SendBuffer, sizeof(SendBuffer)); 55 Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0); 56 if ( Ret == SOCKET_ERROR ) 57 { 58 cout<<"Send Info Error::"<<GetLastError()<<endl; 59 break; 60 } 61 } 62 63 closesocket(ClientSocket); 64 WSACleanup(); 65 66 return 0; 67 }
