linux

Linux进程网络:如何处理网络连接

小樊
40
2025-04-29 06:07:36
栏目: 智能运维

在Linux系统中,处理网络连接通常涉及以下几个步骤:

  1. 创建套接字(Socket)

    • 使用socket()函数创建一个套接字。这个函数返回一个文件描述符,用于后续的网络操作。
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    
  2. 配置套接字地址

    • 使用struct sockaddr_in结构体来配置套接字的IP地址和端口号。
    struct sockaddr_in serv_addr;
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080); // 端口号
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // IP地址
    
  3. 绑定套接字

    • 使用bind()函数将套接字绑定到指定的IP地址和端口号。
    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    
  4. 监听连接

    • 使用listen()函数监听传入的连接请求。
    if (listen(sockfd, 3) < 0) {
        perror("listen failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    
  5. 接受连接

    • 使用accept()函数接受一个传入的连接请求。
    struct sockaddr_in cli_addr;
    socklen_t clilen = sizeof(cli_addr);
    int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("accept failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    
  6. 数据传输

    • 使用read()write()函数进行数据的读取和发送。
    char buffer[256];
    ssize_t n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("read failed");
        close(newsockfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    buffer[n] = '\0';
    printf("Here is the message: %s\n", buffer);
    
    n = write(newsockfd, "I got your message", 18);
    if (n < 0) {
        perror("write failed");
        close(newsockfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    
  7. 关闭套接字

    • 使用close()函数关闭套接字。
    close(newsockfd);
    close(sockfd);
    

示例代码

以下是一个简单的TCP服务器示例,它监听端口8080并处理客户端连接:

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

int main() {
    int sockfd, newsockfd;
    struct sockaddr_in serv_addr, cli_addr;
    socklen_t clilen;
    char buffer[256];

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 配置套接字地址
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

    // 绑定套接字
    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(sockfd, 3) < 0) {
        perror("listen failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 接受连接
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("accept failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 数据传输
    memset(buffer, '0', 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("read failed");
        close(newsockfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    buffer[n] = '\0';
    printf("Here is the message: %s\n", buffer);

    n = write(newsockfd, "I got your message", 18);
    if (n < 0) {
        perror("write failed");
        close(newsockfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 关闭套接字
    close(newsockfd);
    close(sockfd);

    return 0;
}

这个示例展示了如何在Linux系统中处理一个简单的TCP连接。实际应用中可能需要处理多个连接、使用多线程或多进程来提高并发处理能力。

0
看了该问题的人还看了