📜  C语言中的TCP Server-Client实现(1)

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

C语言中的TCP Server-Client实现

本篇介绍如何在C语言中实现TCP协议的Server-Client模型。TCP是一种面向连接、可靠的传输协议,常用于网络通信中。Server-Client模型指的是一个服务端(Server)和多个客户端(Client)之间建立连接,进行数据交换的过程。

实现步骤
1. 创建socket

在C语言中,通过socket函数来创建一个socket。socket函数的原型如下:

int socket(int domain, int type, int protocol);

其中,domain参数指定协议族,type参数指定socket类型,protocol参数指定具体协议。对于TCP协议,domain应为AF_INET,type应为SOCK_STREAM,protocol应为IPPROTO_TCP。代码如下:

int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int server_port = 8888;

server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2. 绑定socket到特定的IP和端口

通过bind函数将socket与特定的IP地址和端口绑定。代码如下:

server_address.sin_family = AF_INET;
server_address.sin_port = htons(server_port);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);

bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
3. 监听socket

通过listen函数监听socket,等待客户端连接。代码如下:

listen(server_socket, 5);
4. 接受客户端连接

通过accept函数接受客户端连接,并返回与客户端通信的socket。代码如下:

socklen_t client_address_len = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_len);
5. 与客户端通信

通过recv和send函数来接收和发送数据。代码如下:

char buffer[1024];
memset(buffer, 0, sizeof(buffer));

int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
printf("Received %d bytes: %s\n", bytes_received, buffer);

int bytes_sent = send(client_socket, buffer, bytes_received, 0);
printf("Sent %d bytes: %s\n", bytes_sent, buffer);
6. 关闭连接

通过close函数关闭socket。代码如下:

close(client_socket);
close(server_socket);
完整代码

Server端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
    int server_socket, client_socket;
    struct sockaddr_in server_address, client_address;
    int server_port = 8888;

    server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(server_port);
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));

    listen(server_socket, 5);

    printf("Waiting for client connections...\n");

    socklen_t client_address_len = sizeof(client_address);
    client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_len);

    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));

    int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
    printf("Received %d bytes: %s\n", bytes_received, buffer);

    int bytes_sent = send(client_socket, buffer, bytes_received, 0);
    printf("Sent %d bytes: %s\n", bytes_sent, buffer);

    close(client_socket);
    close(server_socket);

    return 0;
}

Client端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
    int client_socket;
    struct sockaddr_in server_address;
    char* server_ip = "127.0.0.1";
    int server_port = 8888;

    client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(server_port);
    server_address.sin_addr.s_addr = inet_addr(server_ip);

    connect(client_socket, (struct sockaddr*) &server_address, sizeof(server_address));

    char* message = "Hello, Server!";
    int message_size = strlen(message);

    int bytes_sent = send(client_socket, message, message_size, 0);
    printf("Sent %d bytes: %s\n", bytes_sent, message);

    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));

    int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
    printf("Received %d bytes: %s\n", bytes_received, buffer);

    close(client_socket);

    return 0;
}
总结

本篇介绍了如何使用C语言实现TCP协议的Server-Client模型。通过socket、bind、listen、accept、recv和send等函数,可以轻松地实现基本的网络通信功能。当然,在实际应用中,可能还需要考虑连接管理、消息协议、数据加密等方面的问题。