MST

星途 面试题库

面试题:C语言在Linux网络编程中常见的错误类型及处理方式

在Linux环境下使用C语言进行网络编程时,经常会遇到一些错误,比如套接字创建失败、连接失败等。请列举至少三种常见错误,并分别阐述在C语言中如何处理这些错误,要求结合实际代码示例说明。
36.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

1. 套接字创建失败(socket()失败)

  • 错误原因:系统资源不足、参数设置错误等。
  • 处理方式:使用perror()打印错误信息,并根据错误码决定后续操作,如退出程序或重试。
  • 代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    // 后续代码...
    close(sockfd);
    return 0;
}

2. 连接失败(connect()失败)

  • 错误原因:目标主机不可达、端口未开放等。
  • 处理方式:同样使用perror()打印错误信息,根据具体情况决定是否重试连接。
  • 代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8080);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        perror("connect failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    // 后续代码...
    close(sockfd);
    return 0;
}

3. 绑定失败(bind()失败)

  • 错误原因:端口已被占用、地址使用不当等。
  • 处理方式:通过perror()打印错误信息,若端口被占用可尝试更换端口。
  • 代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8080);
    servaddr.sin_addr.s_addr = INADDR_ANY;

    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        perror("bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    // 后续代码...
    close(sockfd);
    return 0;
}