首页 > 解决方案 > 错误:C + 多线程中通过 TCP 套接字传输文件的 Seg 错误

问题描述

目标:我正在尝试编写一个并发 TCP 服务器,它接受并响应多个客户端连接请求,每个请求都请求文件传输。

我认为错误出在 start_routine() 中的文件处理部分,需要验证在哪里。(阅读下面的代码更多)

文件:server.c

#define CONNECTIONS 5

FILE *input;
pthread_t tids[CONNECTIONS];
char name[100];
char buff[1024]; //buffer size

void *start_routine(void *arg)
{
    //recv file request
    read((int) arg, name, sizeof(name));

    //file handling
    input = fopen(name, "rb");

    printf("hi\n"); //testing

    while (!feof(input))
        write((int) arg, buff, fread(buff, sizeof(char), sizeof(buff), input));
    
    return NULL;
}

int main(int argc, char *argv[])
{
    struct sockaddr_in serv_addr;

    if (argc != 2)
    {
        printf("Usage: ./a.out <port #>\n");
        exit(0);
    }

    //open socket
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);

    //init sockaddr_in struct
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[1]));
    serv_addr.sin_addr.s_addr = htons(INADDR_ANY);

    //binds listenfd to a specific sockaddr_in
    bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    
    for(int i = 0; i <= CONNECTIONS; i++){
        //listen for new connections on listenfd
        listen(listenfd, CONNECTIONS);
        //accepts a connection
        int connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
        pthread_create(tids, NULL, start_routine, &connfd);
    }

    //cleaning
    close(listenfd);
    fclose(input);

    return 0;
}

文件:client.c

int main(int argc, char *argv[])
{
    int n;
    char buff[1024]; //buffer size
    struct sockaddr_in serv_addr;

    if (argc != 4)
    {
        printf("Usage: ./a.out <file required> <ip of server> <port #> \n");
        exit(0);
    }

    //open socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    //init sockaddr_in struct
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[3]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[2]);

    //connect to <server_ip>: <port>
    connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

    //file handling
    FILE *request;
    request = fopen("dst.txt", "wb");

    //send file request
    write(sockfd, argv[1], strlen(argv[1]) + 1);

    while ((n = read(sockfd, buff, sizeof(buff))) > 0)
        fwrite(buff, sizeof(char), n, request);

    //cleaning
    fclose(request);
    close(sockfd);

    return 0;
}

文件夹中的其他文件:src.txt

编译使用:

gcc server.c -o server -lpthread
./server 8080
gcc client.c -o client
./client src.txt 127.0.0.1 8080

(5份client等每个[client1,client2...client5]编译5次)

问题:导致分段错误。:(

在测试时,我发现分段错误位于 start_routine() 中,在 while 循环中。

我使用了另一个程序中的相同片段(仅更新了变量)——需要知道我哪里出错了!

此外,对于多线程,我创建了客户端程序的副本来模拟与服务器的 5 个连接。希望这是正确的方法。

感谢帮助!

标签: cfiletcpnetwork-programmingtcpclient

解决方案


推荐阅读