工作线程稍后会退出

时间:2015-09-10 02:37:07

标签: c multithreading sockets pthreads

这是一个使用套接字和多线程的简单echo程序,如果客户端(通过telnet)和服务器在同一台机器上运行,它在我的Ubuntu中编译并运行良好,但当我通过telnet从另一台远程连接到服务器时机器,它最初运行良好(每次回复我的消息),但一段时间后,即使telnet会话仍然存在,也没有回声,我不知道问题出在哪里,有人可以对此进行点击吗?我是多线程编程和套接字编程的新手,学习它。

#define ERROR       -1
#define MAX_CLIENTS 2
#define MAX_DATA    1024

void* worker(void* sockId)
{
    int socketId = *(int*)sockId;
    int data_len = 1;
    char data[MAX_DATA];
    while(data_len > 0)
    {
        data_len = recv(socketId, data, MAX_DATA, 0);
        if (data_len > 0)
        {
            send(socketId, data, data_len, 0);
            data[data_len] = '\0';
            printf("Sent message: %s", data);
        }
    }
    printf("Client disconnected\n");
    close(socketId);
}

int main(int argc, char* argv[])
{
    if (argc <= 1)
    {
        printf("missing argument: port\n");
        exit(-1);
    }

    struct sockaddr_in server;
    struct sockaddr_in client;
    int sock;
    int new_connection;
    int sockaddr_len = sizeof(struct sockaddr_in);

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
    {
        perror("server socket: ");
        exit(-1);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[1]));
    server.sin_addr.s_addr = INADDR_ANY;
    bzero(&server.sin_zero, 8);

    if ((bind(sock, (struct sockaddr*)&server, sockaddr_len)) == ERROR)
    {
        perror("bind: ");
        exit(-1);
    }

    if ((listen(sock, MAX_CLIENTS)) == ERROR)
    {
        perror("listen: ");
        exit(-1);
    }

    while(1)
    {
        if ((new_connection = accept(sock, (struct sockaddr*)&client, &sockaddr_len)) == ERROR)
        {
            perror("accpet: ");
            exit(-1);
        }
        printf("New Client connected from port: %d and IP: %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr));

        pthread_t thread;
        pthread_create(&thread, NULL, worker, (void*)&new_connection);
        pthread_detach(thread);
    }
    close(sock);

    pthread_exit(NULL);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

添加一些日志记录,您可能会发现send中的代码被阻止了。您使用天真的顺序I / O,因此如果连接的另一端停止读取数据,很快您也会这样做。