Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 工作线程稍后退出_C_Multithreading_Sockets_Pthreads - Fatal编程技术网

C 工作线程稍后退出

C 工作线程稍后退出,c,multithreading,sockets,pthreads,C,Multithreading,Sockets,Pthreads,这是一个使用套接字和多线程的简单echo程序,如果客户端(通过telnet)和服务器在同一台机器上运行,它在我的Ubuntu中编译并运行良好,但当我从另一台机器通过telnet远程连接到服务器时,它最初运行良好(每次回显我的消息),但过了一段时间,即使telnet会话仍处于活动状态,也没有回声,我不确定问题出在哪里,有人能对此给出一些提示吗?我是多线程编程和套接字编程的新手,正在学习这方面的知识 #define ERROR -1 #define MAX_CLIENTS 2 #defi

这是一个使用套接字和多线程的简单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
#定义MAX_客户端2
#定义MAX_数据1024
void*worker(void*sockId)
{
int socketId=*(int*)socketId;
int data_len=1;
字符数据[最大值数据];
而(数据长度>0)
{
data_len=recv(socketId,data,MAX_data,0);
如果(数据长度>0)
{
发送(socketId,data,data_len,0);
数据[数据长度]='\0';
printf(“已发送消息:%s”,数据);
}
}
printf(“客户端已断开连接”);
关闭(socketId);
}
int main(int argc,char*argv[])
{

如果如果你使用了一些日志,你可能会发现你的代码被阻塞在代码>发送< /代码>。你使用天真的,顺序的I/O,所以如果连接的另一端停止读取数据,很快你也会这样做。< /P>这是编译吗?新的是C++中的保留字。也许你用C编译了吗?它使用GCC编译得很好。是的,我应该使用另一个N。在C++中,它是一个保留的词。<代码>如果(DATAYLLN)<代码>应该是<代码>(DATAYLLN>0)< /C>和。(DATAYLLN)< /C>应该是<代码>(DATAYLLN>0)
。否则,您会看到一个错误。当您说它停止回音时,您是说它停止显示
发送的消息:…
东西?还是说它停止在套接字上发送?或者两者都停止?它停止显示发送的消息:…这听起来很有意义,我需要时间来验证。但问题是,为什么telnet来自同一台机器由于echo服务器程序始终处于活动状态,我相信worker也在一个新线程中运行,即使在一天后它也可以回显。@FrankZhang在这种情况下,出站数据被读取。可能部分原因是您正在连接telnet,但尚未实现,因此您可能无法与某些版本进行互操作是telnet的一部分。