Windows Socket编程

来源:互联网 发布:人民网微博微信矩阵 编辑:程序博客网 时间:2024/05/16 09:17
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 <Windows.h>  4   5 using namespace std;  6   7 #define  PORT 4000  8 #define  IP_ADDRESS "192.168.1.145"  9  10 DWORD WINAPI ClientThread(LPVOID lpParameter) 11 { 12     SOCKET CientSocket = (SOCKET)lpParameter; 13     int Ret = 0; 14     char RecvBuffer[MAX_PATH]; 15  16     while ( true ) 17     { 18         memset(RecvBuffer, 0x00, sizeof(RecvBuffer)); 19         Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0); 20         if ( Ret == 0 || Ret == SOCKET_ERROR )  21         { 22             cout<<"客户端退出!"<<endl; 23             break; 24         } 25         cout<<"接收到客户信息为:"<<RecvBuffer<<endl; 26     } 27  28     return 0; 29 } 30  31 int main(int argc, char* argv[]) 32 { 33     WSADATA  Ws; 34     SOCKET ServerSocket, CientSocket; 35     struct sockaddr_in LocalAddr, ClientAddr; 36     int Ret = 0; 37     int AddrLen = 0; 38     HANDLE hThread = NULL; 39  40     //Init Windows Socket 41     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ) 42     { 43         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl; 44         return -1; 45     } 46      47     //Create Socket 48     ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 49     if ( ServerSocket == INVALID_SOCKET ) 50     { 51         cout<<"Create Socket Failed::"<<GetLastError()<<endl; 52         return -1; 53     } 54  55     LocalAddr.sin_family = AF_INET; 56     LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); 57     LocalAddr.sin_port = htons(PORT); 58     memset(LocalAddr.sin_zero, 0x00, 8); 59  60     //Bind Socket 61     Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr)); 62     if ( Ret != 0 ) 63     { 64         cout<<"Bind Socket Failed::"<<GetLastError()<<endl; 65         return -1; 66     } 67  68     Ret = listen(ServerSocket, 10); 69     if ( Ret != 0 ) 70     { 71         cout<<"listen Socket Failed::"<<GetLastError()<<endl; 72         return -1; 73     } 74  75     cout<<"服务端已经启动"<<endl; 76  77     while ( true ) 78     { 79         AddrLen = sizeof(ClientAddr); 80         CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen); 81         if ( CientSocket == INVALID_SOCKET ) 82         { 83             cout<<"Accept Failed::"<<GetLastError()<<endl; 84             break; 85         } 86  87         cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl; 88          89         hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL); 90         if ( hThread == NULL ) 91         { 92             cout<<"Create Thread Failed!"<<endl; 93             break; 94         } 95  96         CloseHandle(hThread); 97     } 98  99     closesocket(ServerSocket);100     closesocket(CientSocket);101     WSACleanup();102 103     return 0;104 }

1 //Client.cpp 2 #include <iostream> 3 #include <Windows.h> 4  5 using namespace std; 6  7 #define  PORT 4000 8 #define  IP_ADDRESS "192.168.1.145" 9 10 11 int main(int argc, char* argv[])12 {13     WSADATA  Ws;14     SOCKET CientSocket;15     struct sockaddr_in ServerAddr;16     int Ret = 0;17     int AddrLen = 0;18     HANDLE hThread = NULL;19     char SendBuffer[MAX_PATH];20 21     //Init Windows Socket22     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )23     {24         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;25         return -1;26     }27 28     //Create Socket29     CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);30     if ( CientSocket == 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(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));42     if ( Ret == SOCKET_ERROR )43     {44         cout<<"Connect Error::"<<GetLastError()<<endl;45         return -1;46     }47     else48     {49         cout<<"连接成功!"<<endl;50     }51 52     while ( true )53     {54         cin.getline(SendBuffer, sizeof(SendBuffer));55         Ret = send(CientSocket, 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(CientSocket);64     WSACleanup();65 66     return 0;67 }


0 0