我使用线程开发了一个聊天服务器程序。在这个程序中有两个线程:
两个线程都包含无限循环,以便连续发送和接收数据。但是当它被执行时,用于接收数据的线程卡在循环中。
服务器的代码:
{
addr_len=sizeof(cli_addr);
cli_sock=accept(sock,(struct sockaddr *)&cli_addr,&addr_len);
if(cli_sock<0)
printf("\nConnetion Error\n");
else
printf("conneted\n");
status_s=pthread_create(&thread_s,NULL,send_data,&cli_sock);
if(status_s==0)
printf("sending");
status_r=pthread_create(&thread_r,NULL,recieve_data,&cli_sock);
if(status_r==0)
printf("recieving");
}
}
void *recieve_data(void *num)
{
int *sock_r=(int *) num;
int sock=*sock_r;
char msg[50];
while(1)
{
recv(sock_r,msg,sizeof(msg),0);
if(strcmp(msg,"exit")==0)
{
break;
}
printf("recieved data:");
recv(sock_r,msg,sizeof(msg),0);
printf("\n%s",msg);
}
}
void *send_data(void *num)
{
int *sock_s=(int *) num;
int sock=*sock_s;
char msg[50];
while(1)
{
gets(msg);
//printf("sending data");
if(strcmp(msg,"exit")==0)
{
break;
}
send(sock_s,msg,sizeof(msg),0);
}
send(sock,msg,sizeof(msg),0);
}
答案 0 :(得分:0)
如果像“exit”这样的控制命令是基于int的,那会更好。
此外,接收数据不处理对等连接关闭状态。例如: 复制自here。
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while( iResult > 0 );