[toc]

用C语言在windows中使用TCP协议发送文本消息

1.用C语言在windows中使用TCP协议发送一句文本消息

1.使用C语言在windows中创建服务端程序接收一句文本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//WinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

// 开始监听
listen(serverSocket, 3);
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket == INVALID_SOCKET) {
printf("Accept failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

char clientIP[INET_ADDRSTRLEN]; // 用于存储客户端 IP 地址
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Connection accepted from %s:%d\n", clientIP, ntohs(client.sin_port));

// 接收消息
while ((recvSize = recv(clientSocket, buffer, sizeof(buffer) - 1, 0)) > 0) {
buffer[recvSize] = '\0'; // 添加字符串结束符
printf("Received message: %s\n", buffer);
}

if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
}

// 关闭 sockets
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序发送一句文本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char* message;
int sendResult;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
printf("Connection failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

// 要发送的消息
message = "Hello, Server!";

// 发送消息
sendResult = send(sock, message, strlen(message), 0);
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
}
else {
printf("Message sent: %s\n", message);
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe
  2. 运行WinClient.exe
  3. 运行结果如图所示

1-1recieve_text

2.用C语言在windows中使用TCP协议多次发送文本消息

1.使用C语言在windows中创建服务端程序多次接收文本消息(服务端不变)

2.使用C语言在windows中创建客户端程序多次发送文本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
int sendResult;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
printf("Connection failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

// 发送多条消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = send(sock, message, strlen(message), 0);
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
}
else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行结果如图所示

    C+Socks1-2sends_text

3.用C语言在windows中使用TCP协议客户端退出后可以再次连接服务器

1.使用C语言在windows中创建服务端程序断开后等待客户端连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//WinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

// 开始监听
listen(serverSocket, 3);
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);

// 循环接受连接
while (1) {
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket == INVALID_SOCKET) {
printf("Accept failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

char clientIP[INET_ADDRSTRLEN]; // 用于存储客户端 IP 地址
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Connection accepted from %s:%d\n", clientIP, ntohs(client.sin_port));

// 接收消息
while ((recvSize = recv(clientSocket, buffer, sizeof(buffer) - 1, 0)) > 0) {
buffer[recvSize] = '\0'; // 添加字符串结束符
printf("Received message: %s\n", buffer);
}

if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
}

// 关闭客户端 socket
closesocket(clientSocket);
printf("Client disconnected.\n");
}

// 关闭服务器 socket
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序退出后再次连接服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
int sendResult;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
printf("Connection failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

// 发送多条消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = send(sock, message, strlen(message), 0);
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
}
else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行结果如图所示

    C+Socks-1-3reconnect

4.用C语言在windows中使用TCP协议让客户端与服务端相互发送文本消息

1.使用C语言在windows中创建服务端接收文本消息后再发送到客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//WinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

// 开始监听
listen(serverSocket, 3);
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);

// 循环接受连接
while (1) {
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket == INVALID_SOCKET) {
printf("Accept failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

char clientIP[INET_ADDRSTRLEN]; // 用于存储客户端 IP 地址
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Connection accepted from %s:%d\n", clientIP, ntohs(client.sin_port));

// 接收和发送消息
while (1) {
// 接收消息
recvSize = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (recvSize > 0) {
buffer[recvSize] = '\0'; // 添加字符串结束符
printf("Received message from client: %s\n", buffer);

// 发送回客户端
send(clientSocket, buffer, recvSize, 0);
}
else if (recvSize == 0) {
printf("Client disconnected.\n");
break; // 客户端断开连接
}
else {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
break;
}
}

// 关闭客户端 socket
closesocket(clientSocket);
}

// 关闭服务器 socket
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序接收与发送文本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
char buffer[1024];
int sendResult, recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
printf("Connection failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

// 发送和接收消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = send(sock, message, strlen(message), 0);
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
}
else {
printf("Message sent: %s\n", message);
}

// 接收来自服务器的消息
recvSize = recv(sock, buffer, sizeof(buffer) - 1, 0);
if (recvSize > 0) {
buffer[recvSize] = '\0'; // 添加字符串结束符
printf("Received from server: %s\n", buffer);
}
else if (recvSize == 0) {
printf("Server disconnected.\n");
break; // 服务器断开连接
}
else {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
break;
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行结果如图所C+Socks-1-4send_recive_text

5.用C语言在windows中使用TCP协议让两个客户端之间可以相互发送文本消息

1.使用C语言在windows中创建服务端接收与转发文本消息到所有客户端中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//WinServer.c
#include <winsock2.h>
#include <ws2tcpip.h> // 包含 inet_ntop 的定义
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#pragma comment(lib,"WS2_32.lib")
#define MAX_CLNT 256
#define BUF_SIZE 100

void error_handling(const char* msg);
DWORD WINAPI ThreadProc(LPVOID lpParam);
void send_msg(char* msg, int len);
HANDLE g_hEvent;
int clnt_cnt = 0;
int clnt_socks[MAX_CLNT];
HANDLE hThread[MAX_CLNT];

int main()
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
WSAStartup(sockVersion, &wsaData);

g_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);

SOCKET serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serv_sock == INVALID_SOCKET)
error_handling("Failed socket()");

struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.s_addr = INADDR_ANY;

if (bind(serv_sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
error_handling("Failed bind()");

if (listen(serv_sock, 256) == SOCKET_ERROR)
error_handling("Failed listen()");
printf("Start listen:\n");

struct sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
DWORD dwThreadId;
SOCKET clnt_sock;

while (TRUE)
{
printf("等待新连接\n");
clnt_sock = accept(serv_sock, (SOCKADDR*)&remoteAddr, &nAddrLen);
if (clnt_sock == INVALID_SOCKET)
{
printf("Failed accept()");
continue;
}

WaitForSingleObject(g_hEvent, INFINITE);
hThread[clnt_cnt] = CreateThread(
NULL,
NULL,
ThreadProc,
(void*)&clnt_sock,
0,
&dwThreadId);
clnt_socks[clnt_cnt++] = clnt_sock;
SetEvent(g_hEvent);

char ip_str[INET_ADDRSTRLEN]; // 用于存储 IP 地址字符串
inet_ntop(AF_INET, &remoteAddr.sin_addr, ip_str, sizeof(ip_str));
printf(" 接受到一个连接:%s 执行线程ID:%d\r\n", ip_str, dwThreadId);
}
WaitForMultipleObjects(clnt_cnt, hThread, TRUE, INFINITE);
for (int i = 0; i < clnt_cnt; i++)
{
CloseHandle(hThread[i]);
}
closesocket(serv_sock);
WSACleanup();
return 0;
}

void error_handling(const char* msg)
{
printf("%s\n", msg);
WSACleanup();
exit(1);
}

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int clnt_sock = *((int*)lpParam);
int str_len = 0, i;
char msg[BUF_SIZE];

while ((str_len = recv(clnt_sock, msg, sizeof(msg), 0)) != -1)
{
send_msg(msg, str_len);
printf("群发送成功\n");
}
printf("客户端退出:%d\n", GetCurrentThreadId());

WaitForSingleObject(g_hEvent, INFINITE);
for (i = 0; i < clnt_cnt; i++)
{
if (clnt_sock == clnt_socks[i])
{
while (i++ < clnt_cnt - 1)
clnt_socks[i] = clnt_socks[i + 1];
break;
}
}
clnt_cnt--;
SetEvent(g_hEvent);
closesocket(clnt_sock);
return NULL;
}

void send_msg(char* msg, int len)
{
int i;
WaitForSingleObject(g_hEvent, INFINITE);
for (i = 0; i < clnt_cnt; i++)
send(clnt_socks[i], msg, len, 0);
SetEvent(g_hEvent);
}

2.使用C语言在windows中创建客户端程序接收与发送文本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//WinClient.c
#include <winsock2.h>
#include <ws2tcpip.h> // 包含 inet_ntop 和 inet_pton 的定义
#include <stdio.h>
#include <windows.h>
#include <string.h>
#pragma comment(lib,"WS2_32.lib")

#pragma warning(disable:4996)
#define BUF_SIZE 256
#define NAME_SIZE 30

DWORD WINAPI send_msg(LPVOID lpParam);
DWORD WINAPI recv_msg(LPVOID lpParam);
void error_handling(const char* msg);

char name[NAME_SIZE] = "[DEFAULT]";
char msg[BUF_SIZE];

int main()
{
HANDLE hThread[2];
DWORD dwThreadId;
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
WSAStartup(sockVersion, &wsaData);

printf("Input your Chat Name: ");
scanf("%s", name);
getchar(); // 接收换行符

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
error_handling("Failed socket()");

struct sockaddr_in servAddr; // 使用 sockaddr_in 结构体
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8888);

// 使用 inet_pton 替代 inet_addr
if (inet_pton(AF_INET, "127.0.0.1", &servAddr.sin_addr) <= 0) {
error_handling("Invalid address/ Address not supported");
}

if (connect(sock, (struct sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
error_handling("Failed connect()");
printf("connect success\n");

hThread[0] = CreateThread(
NULL,
NULL,
send_msg,
(LPVOID)&sock,
0,
&dwThreadId);
hThread[1] = CreateThread(
NULL,
NULL,
recv_msg,
(LPVOID)&sock,
0,
&dwThreadId);

WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
printf("Thread Over, Enter anything to over.\n");
getchar();
closesocket(sock);
WSACleanup();
return 0;
}

DWORD WINAPI send_msg(LPVOID lpParam)
{
int sock = *((int*)lpParam);
char name_msg[NAME_SIZE + BUF_SIZE];
while (1)
{
fgets(msg, BUF_SIZE, stdin);
if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n"))
{
closesocket(sock);
exit(0);
}
sprintf(name_msg, "[%s]: %s", name, msg);
send(sock, name_msg, strlen(name_msg), 0);
}
return NULL;
}

DWORD WINAPI recv_msg(LPVOID lpParam)
{
int sock = *((int*)lpParam);
char name_msg[NAME_SIZE + BUF_SIZE];
int str_len;
while (1)
{
str_len = recv(sock, name_msg, NAME_SIZE + BUF_SIZE - 1, 0);
if (str_len == -1)
return -1;
name_msg[str_len] = 0;
fputs(name_msg, stdout);
}
return NULL;
}

void error_handling(const char* msg)
{
printf("%s\n", msg);
WSACleanup();
exit(1);
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行结果如图所示

    C+Socks-1-6IPV6_recieve_text

6.用C语言在windows中使用TCP协议与ipv6协议发送一句文本消息

1.使用C语言在windows中使用ipv6地址创建服务端程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#define PORT "8080" // 服务器端口
#define BACKLOG 10 // 最大连接数

int main() {
WSADATA wsaData;
struct addrinfo hints, * res;
SOCKET listenfd, clientfd;
struct sockaddr_storage client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[1024];
int recvResult;

// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed: %d\n", WSAGetLastError());
return 1;
}

// 设置addrinfo结构
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // 使用IPv6
hints.ai_socktype = SOCK_STREAM; // TCP
hints.ai_flags = AI_PASSIVE; // 服务器使用

// 获取地址信息
if (getaddrinfo(NULL, PORT, &hints, &res) != 0) {
printf("getaddrinfo failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 创建socket
listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (listenfd == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
freeaddrinfo(res);
WSACleanup();
return 1;
}

// 绑定socket
if (bind(listenfd, res->ai_addr, (int)res->ai_addrlen) == SOCKET_ERROR) {
printf("bind failed: %d\n", WSAGetLastError());
closesocket(listenfd);
freeaddrinfo(res);
WSACleanup();
return 1;
}

freeaddrinfo(res); // 释放addrinfo结构

// 开始监听
if (listen(listenfd, BACKLOG) == SOCKET_ERROR) {
printf("listen failed: %d\n", WSAGetLastError());
closesocket(listenfd);
WSACleanup();
return 1;
}

printf("Server is listening on port %s...\n", PORT);

// 接受客户端连接
clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &addr_len);
if (clientfd == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
closesocket(listenfd);
WSACleanup();
return 1;
}

// 接收消息
recvResult = recv(clientfd, buffer, sizeof(buffer) - 1, 0);
if (recvResult > 0) {
buffer[recvResult] = '\0'; // 添加字符串结束符
printf("Received message: %s\n", buffer);
}
else {
printf("recv failed: %d\n", WSAGetLastError());
}

// 关闭socket
closesocket(clientfd);
closesocket(listenfd);
WSACleanup();
return 0;
}

2.使用C语言在windows中使用ipv6地址创建客户端程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#define PORT "8080" // 服务器端口
#define SERVER_ADDR "::1" // 服务器地址(本地IPv6地址)

int main() {
WSADATA wsaData;
struct addrinfo hints, * res;
SOCKET sockfd;
const char* message = "Hello, IPv6 TCP Server!";
int sendResult;

// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed: %d\n", WSAGetLastError());
return 1;
}

// 设置addrinfo结构
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // 使用IPv6
hints.ai_socktype = SOCK_STREAM; // TCP
hints.ai_flags = 0;

// 获取服务器地址信息
if (getaddrinfo(SERVER_ADDR, PORT, &hints, &res) != 0) {
printf("getaddrinfo failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 创建socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
freeaddrinfo(res);
WSACleanup();
return 1;
}

// 连接到服务器
if (connect(sockfd, res->ai_addr, (int)res->ai_addrlen) == SOCKET_ERROR) {
printf("connect failed: %d\n", WSAGetLastError());
closesocket(sockfd);
sockfd = INVALID_SOCKET;
}

freeaddrinfo(res); // 释放addrinfo结构

if (sockfd == INVALID_SOCKET) {
WSACleanup();
return 1;
}

// 发送消息
sendResult = send(sockfd, message, (int)strlen(message), 0);
if (sendResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sockfd);
WSACleanup();
return 1;
}

printf("Message sent: %s\n", message);

// 关闭socket
closesocket(sockfd);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行结果如图所示

    C+Socks-1-5chats