gpt4 book ai didi

c - 工作线程在一段时间后退出

转载 作者:行者123 更新时间:2023-11-30 19:42:14 25 4
gpt4 key购买 nike

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

#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;
}

最佳答案

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

关于c - 工作线程在一段时间后退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32492200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com