📅  最后修改于: 2023-12-03 15:39:56.137000             🧑  作者: Mango
该题目涉及网络编程领域。UGC-NET CS 2017 年 11 月 – III |问题 17的主要内容是:在 Linux 平台上,如何使用 C 语言编写一个 TCP 客户端程序和一个 TCP 服务端程序。
TCP 客户端程序的步骤如下:
创建套接字:使用 socket() 函数创建套接字,指定协议类型为 AF_INET,使用 TCP 协议。
连接服务器:使用 connect() 函数连接服务器,指定服务器的 IP 地址和端口号。
发送数据:使用 send() 函数向服务器发送数据。
接收数据:使用 recv() 函数从服务器接收数据。
关闭连接:使用 close() 函数关闭连接。
以下是一个示例 TCP 客户端程序的代码片段:
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
int main(void) {
int sock;
struct sockaddr_in server;
char message[1000], server_reply[2000];
// 创建套接字
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
printf("Could not create socket");
}
// 设置服务器地址和端口号
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(8080);
// 连接服务器
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connect failed. Error");
return 1;
}
// 发送数据
strcpy(message, "Hello server!");
if (send(sock, message, strlen(message), 0) < 0) {
printf("Send failed");
return 1;
}
// 接收数据
if (recv(sock, server_reply, 2000, 0) < 0) {
printf("Recv failed");
return 1;
}
printf("Server reply: %s\n", server_reply);
// 关闭套接字
close(sock);
return 0;
}
TCP 服务端程序的步骤如下:
创建套接字:使用 socket() 函数创建套接字,指定协议类型为 AF_INET,使用 TCP 协议。
绑定地址和端口号:使用 bind() 函数将套接字绑定到特定的 IP 地址和端口号。
监听连接请求:使用 listen() 函数监听连接请求。
接受连接:使用 accept() 函数接受连接请求,返回一个新的套接字,可以使用该套接字与连接上的客户端进行通信。
接收数据:使用 recv() 函数从客户端接收数据。
发送数据:使用 send() 函数向客户端发送数据。
关闭连接:使用 close() 函数关闭连接。
以下是一个示例 TCP 服务端程序的代码片段:
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
int main(void) {
int socket_desc, client_sock, c, read_size;
struct sockaddr_in server, client;
char client_message[2000];
// 创建套接字
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1) {
printf("Could not create socket");
}
// 设置服务器地址和端口号
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8080);
// 绑定地址和端口号
if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Bind failed. Error");
return 1;
}
// 监听连接请求
listen(socket_desc , 3);
// 接受连接
printf("Waiting for incoming connections...\n");
c = sizeof(struct sockaddr_in);
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0) {
perror("Accept failed");
return 1;
}
printf("Connection accepted\n");
// 接收数据
while ((read_size = recv(client_sock, client_message, 2000, 0)) > 0) {
printf("Client message: %s\n", client_message);
// 发送数据
if (send(client_sock, "Hello client!", strlen("Hello client!"), 0) < 0) {
printf("Send failed");
return 1;
}
memset(client_message, 0, sizeof(client_message));
}
if (read_size == 0) {
printf("Client disconnected\n");
} else if (read_size == -1) {
perror("Recv failed");
return 1;
}
// 关闭套接字
close(socket_desc);
return 0;
}
以上是本题的详细介绍,如果您需要更多信息,可以参考相关书籍或官方文档。