Linux进程网络:连接建立与维护方法

141
2025/4/15 3:32:15
栏目: 智能运维
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

在Linux系统中,进程之间的网络通信通常通过套接字(socket)来实现。套接字是一种通信端点,允许不同进程通过网络进行数据交换。以下是Linux进程中网络连接建立与维护的基本方法:

连接建立

  1. 创建套接字

    • 使用socket()函数创建一个套接字。
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    
  2. 配置地址和端口

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

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

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

    • 使用accept()函数接受一个传入连接。
    int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    

连接维护

  1. 数据传输

    • 使用send()recv()函数进行数据的发送和接收。
    char buffer[1024];
    int n = recv(newsockfd, buffer, sizeof(buffer), 0);
    if (n < 0) {
        perror("recv failed");
        exit(EXIT_FAILURE);
    }
    printf("Received message: %s\n", buffer);
    
    n = send(newsockfd, "Hello, client!", 14, 0);
    if (n < 0) {
        perror("send failed");
        exit(EXIT_FAILURE);
    }
    
  2. 关闭连接

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

错误处理

在网络编程中,错误处理是非常重要的。常用的错误处理方法包括:

  • 使用perror()函数打印错误信息。
  • 检查返回值,确保函数调用成功。

示例代码

以下是一个简单的TCP服务器示例,展示了如何建立和维护连接:

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

#define PORT 8080

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

    // 创建套接字
    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(PORT);
    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");
        exit(EXIT_FAILURE);
    }

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

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

    // 数据传输
    int n = recv(newsockfd, buffer, sizeof(buffer), 0);
    if (n < 0) {
        perror("recv failed");
        exit(EXIT_FAILURE);
    }
    printf("Received message: %s\n", buffer);

    n = send(newsockfd, "Hello, client!", 14, 0);
    if (n < 0) {
        perror("send failed");
        exit(EXIT_FAILURE);
    }

    // 关闭连接
    close(newsockfd);
    close(sockfd);

    return 0;
}

这个示例展示了如何创建一个简单的TCP服务器,接受客户端连接,并进行基本的数据交换。实际应用中可能需要处理更多的错误情况和并发连接。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: linux怎么设置redis开机自启动