📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 11 月 – III |问题 17(1)

📅  最后修改于: 2023-12-03 15:39:56.137000             🧑  作者: Mango

UGC-NET CS 2017 年 11 月 – III |题目 17

该题目涉及网络编程领域。UGC-NET CS 2017 年 11 月 – III |问题 17的主要内容是:在 Linux 平台上,如何使用 C 语言编写一个 TCP 客户端程序和一个 TCP 服务端程序。

TCP 客户端程序

TCP 客户端程序的步骤如下:

  1. 创建套接字:使用 socket() 函数创建套接字,指定协议类型为 AF_INET,使用 TCP 协议。

  2. 连接服务器:使用 connect() 函数连接服务器,指定服务器的 IP 地址和端口号。

  3. 发送数据:使用 send() 函数向服务器发送数据。

  4. 接收数据:使用 recv() 函数从服务器接收数据。

  5. 关闭连接:使用 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 服务端程序

TCP 服务端程序的步骤如下:

  1. 创建套接字:使用 socket() 函数创建套接字,指定协议类型为 AF_INET,使用 TCP 协议。

  2. 绑定地址和端口号:使用 bind() 函数将套接字绑定到特定的 IP 地址和端口号。

  3. 监听连接请求:使用 listen() 函数监听连接请求。

  4. 接受连接:使用 accept() 函数接受连接请求,返回一个新的套接字,可以使用该套接字与连接上的客户端进行通信。

  5. 接收数据:使用 recv() 函数从客户端接收数据。

  6. 发送数据:使用 send() 函数向客户端发送数据。

  7. 关闭连接:使用 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;
}

以上是本题的详细介绍,如果您需要更多信息,可以参考相关书籍或官方文档。