C语言编程题实现一个简易的客户端和服务器通信

C语言编程题,实现一个简易的客户端和服务器通信。一个简易的客户端-服务器通信程序,通常使用 套接字(Socket) 编程。这涉及到客户端和服务器通过网络(TCP/IP 协议)进行数据传输。我们将展示如何通过 C 语言使用 TCP 套接字实现一个基本的客户端和服务器。

1、服务器程序

服务器的任务是等待客户端的连接请求,接受连接并进行数据通信。使用 socket() 创建一个 TCP 套接字。协议族选择 AF_INET,传输类型选择 SOCK_STREAM。使用 bind() 将套接字绑定到指定的端口和 IP 地址。通过 listen() 函数,让服务器开始监听客户端的连接请求。使用 accept() 函数接受客户端的连接请求,这会返回一个新的套接字用于与该客户端通信。:使用 read() 从客户端接收消息,然后通过 send() 将响应发送回客户端。通信完成后,关闭套接字。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080  // 服务器端口
#define BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};

    // 创建套接字文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 绑定IP和端口
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;  // 允许来自任意地址的连接
    address.sin_port = htons(PORT);  // 将端口号转换为网络字节序

    // 绑定套接字到端口
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 开始监听连接请求
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    printf("服务器正在监听端口 %d...\n", PORT);

    // 等待客户端连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 读取客户端发送的消息
    int valread = read(new_socket, buffer, BUFFER_SIZE);
    printf("接收到的消息: %s\n", buffer);

    // 发送响应回客户端
    send(new_socket, buffer, strlen(buffer), 0);
    printf("消息已发送回客户端\n");

    // 关闭套接字
    close(new_socket);
    close(server_fd);

    return 0;
}

2、客户端程序

客户端的任务是向服务器发起连接,发送数据,并接收来自服务器的响应。使用 socket() 创建一个 TCP 套接字。通过 serv_addr 结构体设置服务器的 IP 地址和端口号。使用 connect() 连接到服务器。使用 send() 发送消息到服务器,使用 read() 接收来自服务器的响应。通信完成后,关闭套接字。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *message = "Hello, Server!";
    char buffer[BUFFER_SIZE] = {0};

    // 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("套接字创建失败\n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    // 将IP地址转换为二进制形式
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("无效的地址/地址不支持\n");
        return -1;
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("连接失败\n");
        return -1;
    }

    // 发送消息到服务器
    send(sock, message, strlen(message), 0);
    printf("消息已发送: %s\n", message);

    // 接收服务器的响应
    int valread = read(sock, buffer, BUFFER_SIZE);
    printf("从服务器接收到的消息: %s\n", buffer);

    // 关闭套接字
    close(sock);

    return 0;
}

3、在 Linux 或 macOS 上编译运行

可以使用 GCC 编译器编译 C 语言代码。确保已经安装了 GCC 编译器,如果没有安装,可以通过命令安装。安装方法可以参考下面文档。

参考文档:GCC编译器安装

1)编译服务器和客户端程序

gcc server.c -o server 

gcc client.c -o client

2)运行服务器

先启动服务器,它会监听指定的端口等待客户端连接。

./server

3)运行客户端

启动客户端,它会向服务器发送消息并接收响应。

./client

4、在 Windows 上编译运行

如在 Windows 上编写并运行套接字程序,需要包含 Winsock 库并调用 WSAStartup() 来初始化 Winsock。

1)使用 Visual Studio 或 CodeBlocks 编译程序,需要在程序中添加代码

#include <winsock2.h>
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);

2)在完成工作后记得调用 WSACleanup() 清理 Winsock 资源

WSACleanup();

推荐阅读
cjavapy编程之路首页