[toc]

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

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

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

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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_ntop
#include <sys/socket.h> // for socket(), bind(), listen(), accept()

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

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("Could not create socket");
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)) < 0) {
perror("Bind failed");
close(serverSocket);
return 1;
}

// 开始监听
if (listen(serverSocket, 3) < 0) {
perror("Listen failed");
close(serverSocket);
return 1;
}
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket < 0) {
perror("Accept failed");
close(serverSocket);
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 < 0) {
perror("Receive failed");
}

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

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

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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_pton
#include <sys/socket.h> // for socket(), connect()

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

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Could not create socket");
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) {
perror("Invalid address/ Address not supported");
close(sock);
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
perror("Connection failed");
close(sock);
return 1;
}

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

// 发送消息
sendResult = send(sock, message, strlen(message), 0);
if (sendResult < 0) {
perror("Send failed");
} else {
printf("Message sent: %s\n", message);
}

// 关闭 socket
close(sock);
return 0;
}

3.运行结果

  1. 运行LinServer
  2. 运行LinClient
  3. 运行成功

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

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

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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_ntop
#include <sys/socket.h> // for socket(), bind(), listen(), accept()

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

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("Could not create socket");
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)) < 0) {
perror("Bind failed");
close(serverSocket);
return 1;
}

// 开始监听
if (listen(serverSocket, 3) < 0) {
perror("Listen failed");
close(serverSocket);
return 1;
}
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket < 0) {
perror("Accept failed");
close(serverSocket);
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 < 0) {
perror("Receive failed");
}

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

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

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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_pton
#include <sys/socket.h> // for socket(), connect()

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

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Could not create socket");
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) {
perror("Invalid address/ Address not supported");
close(sock);
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
perror("Connection failed");
close(sock);
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 < 0) {
perror("Send failed");
break;
} else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
close(sock);
return 0;
}

3.运行结果

  1. 运行LinServer

  2. 运行LinClient

  3. 运行成功

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

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

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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_ntop
#include <sys/socket.h> // for socket(), bind(), listen(), accept()

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

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("Could not create socket");
return 1;
}

// 设置 SO_REUSEADDR 选项
int opt = 1;
if (setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt failed");
close(serverSocket);
exit(EXIT_FAILURE);
}

// 设置服务器信息
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)) < 0) {
perror("Bind failed");
close(serverSocket);
return 1;
}

// 开始监听
if (listen(serverSocket, 3) < 0) {
perror("Listen failed");
close(serverSocket);
return 1;
}
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);

// 循环接受连接
while (1) {
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket < 0) {
perror("Accept failed");
close(serverSocket);
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 < 0) {
perror("Receive failed");
}

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

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

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

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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_pton
#include <sys/socket.h> // for socket(), connect()

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

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Could not create socket");
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) {
perror("Invalid address/ Address not supported");
close(sock);
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
perror("Connection failed");
close(sock);
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 < 0) {
perror("Send failed");
break;
} else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
close(sock);
return 0;
}

3.运行结果

  1. 运行LinServer

  2. 运行LinClient

  3. 运行成功

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

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

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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_ntop
#include <sys/socket.h> // for socket(), bind(), listen(), accept()

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

// 创建 socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("Could not create socket");
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)) < 0) {
perror("Bind failed");
close(serverSocket);
return 1;
}

// 开始监听
if (listen(serverSocket, 3) < 0) {
perror("Listen failed");
close(serverSocket);
return 1;
}
printf("Waiting for incoming connections...\n");

clientSize = sizeof(client);

// 循环接受连接
while (1) {
// 接受连接
clientSocket = accept(serverSocket, (struct sockaddr*)&client, &clientSize);
if (clientSocket < 0) {
perror("Accept failed");
close(serverSocket);
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 {
perror("Receive failed");
break;
}
}

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

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

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

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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_pton
#include <sys/socket.h> // for socket(), connect()

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

// 创建 socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Could not create socket");
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) {
perror("Invalid address/ Address not supported");
close(sock);
return 1;
}

// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
perror("Connection failed");
close(sock);
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 < 0) {
perror("Send failed");
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 {
perror("Receive failed");
break;
}
}

// 关闭 socket
close(sock);
return 0;
}

3.运行结果

  1. 运行LinServer

  2. 运行LinClient

  3. 运行成功

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

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

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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_ntop
#include <pthread.h> // for pthreads
#include <errno.h>

#define MAX_CLNT 256
#define BUF_SIZE 100

void error_handling(const char* msg);
void* ThreadProc(void* arg);
void send_msg(char* msg, int len);
int clnt_cnt = 0;
int clnt_socks[MAX_CLNT];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int main() {
int serv_sock;
struct sockaddr_in sin;

// 创建套接字
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
if (serv_sock < 0)
error_handling("Failed socket()");

// 设置服务器地址结构
sin.sin_family = AF_INET;
sin.sin_port = htons(8888); // 监听端口 8888
sin.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口

// 绑定套接字
if (bind(serv_sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)
error_handling("Failed bind()");

// 开始监听
if (listen(serv_sock, 256) < 0)
error_handling("Failed listen()");
printf("Start listen:\n");

struct sockaddr_in remoteAddr;
socklen_t addrLen = sizeof(remoteAddr);
pthread_t tid;

while (1) {
printf("Waiting for new connection...\n");
int clnt_sock = accept(serv_sock, (struct sockaddr*)&remoteAddr, &addrLen);
if (clnt_sock < 0) {
perror("Failed accept()");
continue;
}

// 添加客户端套接字到数组
pthread_mutex_lock(&mutex);
clnt_socks[clnt_cnt++] = clnt_sock;
pthread_mutex_unlock(&mutex);

char ip_str[INET_ADDRSTRLEN]; // 用于存储 IP 地址字符串
inet_ntop(AF_INET, &remoteAddr.sin_addr, ip_str, sizeof(ip_str));
printf("Connection accepted: %s\n", ip_str);

// 创建线程处理客户端
pthread_create(&tid, NULL, ThreadProc, (void*)&clnt_sock);
pthread_detach(tid); // 使线程在结束时自动释放资源
}

close(serv_sock);
return 0;
}

void error_handling(const char* msg) {
perror(msg);
exit(1);
}

void* ThreadProc(void* arg) {
int clnt_sock = *((int*)arg);
int str_len = 0;
char msg[BUF_SIZE];

// 接收消息并广播
while ((str_len = recv(clnt_sock, msg, sizeof(msg), 0)) > 0) {
send_msg(msg, str_len);
printf("Broadcast message sent\n");
}

printf("Client disconnected: %d\n", clnt_sock);
pthread_mutex_lock(&mutex);
// 从客户端数组中移除断开的客户端
for (int i = 0; i < clnt_cnt; i++) {
if (clnt_sock == clnt_socks[i]) {
while (i < clnt_cnt - 1) {
clnt_socks[i] = clnt_socks[i + 1];
i++;
}
break;
}
}
clnt_cnt--;
pthread_mutex_unlock(&mutex);
close(clnt_sock);
return NULL;
}

void send_msg(char* msg, int len) {
pthread_mutex_lock(&mutex);
// 向所有客户端发送消息
for (int i = 0; i < clnt_cnt; i++) {
send(clnt_socks[i], msg, len, 0);
}
pthread_mutex_unlock(&mutex);
}

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

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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in, inet_pton
#include <pthread.h> // for pthreads
#include <errno.h>

#define BUF_SIZE 256
#define NAME_SIZE 30

void* send_msg(void* arg);
void* recv_msg(void* arg);
void error_handling(const char* msg);

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

int main() {
pthread_t threads[2];
int sock;
struct sockaddr_in servAddr;

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

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
error_handling("Failed socket()");

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)) < 0)
error_handling("Failed connect()");
printf("connect success\n");

// 创建发送和接收线程
pthread_create(&threads[0], NULL, send_msg, (void*)&sock);
pthread_create(&threads[1], NULL, recv_msg, (void*)&sock);

// 等待线程结束
pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);

printf("Thread Over, Enter anything to exit.\n");
getchar();
close(sock);
return 0;
}

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

void* recv_msg(void* arg) {
int sock = *((int*)arg);
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 <= 0) {
return NULL; // 连接关闭或出错
}
name_msg[str_len] = 0;
fputs(name_msg, stdout);
}
return NULL;
}

void error_handling(const char* msg) {
perror(msg);
exit(1);
}

3.运行结果

  1. 运行LinServer

  2. 运行LinClient

  3. 运行成功

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

1.使用C语言在Linux中使用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
// LinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in6, inet_pton
#include <netdb.h> // for getaddrinfo
#include <errno.h>

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

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

// 设置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) {
perror("getaddrinfo failed");
return 1;
}

// 创建socket
listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (listenfd < 0) {
perror("socket failed");
freeaddrinfo(res);
return 1;
}

// 绑定socket
if (bind(listenfd, res->ai_addr, res->ai_addrlen) < 0) {
perror("bind failed");
close(listenfd);
freeaddrinfo(res);
return 1;
}

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

// 开始监听
if (listen(listenfd, BACKLOG) < 0) {
perror("listen failed");
close(listenfd);
return 1;
}

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

// 接受客户端连接
clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &addr_len);
if (clientfd < 0) {
perror("accept failed");
close(listenfd);
return 1;
}

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

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

2.使用C语言在Linux中使用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
// LinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for close()
#include <arpa/inet.h> // for sockaddr_in6, inet_pton
#include <netdb.h> // for getaddrinfo
#include <errno.h>

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

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

// 设置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) {
perror("getaddrinfo failed");
return 1;
}

// 创建socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0) {
perror("socket failed");
freeaddrinfo(res);
return 1;
}

// 连接到服务器
if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
perror("connect failed");
close(sockfd);
freeaddrinfo(res);
return 1;
}

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

// 发送消息
sendResult = send(sockfd, message, strlen(message), 0);
if (sendResult < 0) {
perror("send failed");
close(sockfd);
return 1;
}

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

// 关闭socket
close(sockfd);
return 0;
}

3.运行结果

  1. 运行LinServer

  2. 运行LinClient

  3. 运行成功