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