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 Socket
22 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
23 {
24 cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
25 return -1;
26 }
27
28 //Create Socket
29 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 else
48 {
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 }