[toc]

一、使用C语言在windos中写一个tcp客户端程序,在linux中写一个tcp服务端程序

1.用C语言在linux中写一个tcp服务端程序

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(8000); // 服务器端口

// 绑定 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语言在windows中写一个tcp客户端程序

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
//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(8000); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "10.0.1.12", &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;
}

二、使用C语言在windos中写一个tcp客户端与服务端程序,在linux中写一个tcp代理服务器程序

简易步骤:WinClient–>LinuxServerProxy–>WinServer。

1
2
3
graph TD;
A[WinClient<br>连接到LinuxServerProxy<br>设置地址与端口<br>10.0.1.12:8080] --> B[LinuxServerProxy<br>监听端口<br>8080<br>连接到WinServer<b>设置地址与端口<br>10.0.4.1:8888] --> C[WinServer<br>监听端口<br>8888]

1.用C语言在windows中写一个tcp客户端程序

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(8080); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "10.0.1.12", &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;
}

2.用C语言在windows中写一个tcp服务端程序

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;
}

3.用C语言在liunx中写一个tcp代理服务器程序

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
//LinuxServerAgent.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>

#define BUFFER_SIZE 1024

void handle_proxy(int client_socket) {
int target_socket;
struct sockaddr_in target_addr;
char buffer[BUFFER_SIZE];
int n;

// 连接目标服务器
target_socket = socket(AF_INET, SOCK_STREAM, 0);
target_addr.sin_family = AF_INET;
target_addr.sin_port = htons(8888);
inet_pton(AF_INET, "10.0.4.1", &target_addr.sin_addr); // 目标服务器 IP

if (connect(target_socket, (struct sockaddr*)&target_addr, sizeof(target_addr)) < 0) {
perror("Failed to connect to target server");
close(client_socket);
return;
}

printf("Connected to target server.\n");

// 数据转发逻辑
while ((n = recv(client_socket, buffer, BUFFER_SIZE, 0)) > 0) {
send(target_socket, buffer, n, 0);
n = recv(target_socket, buffer, BUFFER_SIZE, 0);
send(client_socket, buffer, n, 0);
}

close(target_socket);
close(client_socket);
printf("Connection closed.\n");
}

int main() {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;

// 创建监听套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;

bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_socket, 10);

printf("Proxy server listening on port 8080...\n");

// 接受客户端连接
client_len = sizeof(client_addr);
while ((client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_len)) > 0) {
printf("Client connected: %s\n", inet_ntoa(client_addr.sin_addr));
handle_proxy(client_socket); // 处理代理逻辑
}

close(server_socket);
return 0;
}