Windows下Socket編程主要包括以下幾部分:
服務端
1、初始化Windows Socket庫。
2、創建Socket。
3、綁定Socket。
4、監聽。
5、Accept。
6、接收、發送數據。
客戶端
1、初始化Windows Socket庫。
2、創建Socket。
3、連接Socket。
4、接收、發送數據。
服務端每接收到一個客戶端的Socket,則創建一個線程。滿足一個服務端連接多個客戶端。
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 }
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<<"服務端已經啟動


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 }
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 }
Windows Socket編程