2016-12-02 133 views
-2

我正在尝试使用线程实现多客户端的客户端服务器应用程序。为了尝试,我想打印来自每个客户端的消息,但是当我从客户端发送消息时,服务器不会打印任何内容。Multiclient服务器套接字不打印客户端消息

服务器(线程代码)

void comunicationHandler(void *socket) 
{ 
    int sock = *(int*) socket; 
    char msg[2000]; 

    while ((strcmp(msg, "!quit")) != 0) { 
     if (recv(sock, msg, 2000, 0) < 0) 
      puts("Error recv"); 
     printf("%s", msg); 
    } 
    puts("Client Disconnected\n"); 
} 
当我发送

! “跳槽”,服务器便会在一个无限循环打印消息

客户

for(;;) { 
    printf("\nInserisci il msg: "); 
    scanf("%s", msg); 
    if (strcmp(msg, "!quit") == 0) 
     break; 
    write(sd, msg, 2000); 
} 
+2

尝试printf(“%s \ n”,msg);相反...... stdout不会刷新它的缓冲区,直到它遇到一个换行符。 –

+0

您应该查看[适当的C格式化](// prohackr112.tk/r/properties-formatting)。或者学习如何[彻底模糊你的代码](// prohackr112.tk/r/proper-c-obfuscation)。 –

+1

“*当我发送”!quit“,*”你不知道,但是''break''出''for'循环。 – alk

回答

3

有多个问题与您的代码:

  1. TCP是基于流的,也不能保证所有的你发送的字节将一次性收到的另一边。您需要修改代码以检查接收的字节数是多少,并且在进行“strcmp”比较之前至少等于“!quit”的大小。
  2. 当你收到等于“!quit”大小的缓冲区时终止缓冲区
  3. 当你打算只发送一个2000字节的缓冲区时, !放弃”。根据需要修改并发送适当的大小
  4. 检查recv返回值是否为0
  5. 在作业完成后,打破服务器和客户端中的循环。
1

Server出现在无限循环中

要测试recv()的结果与0的结果并在此情况下退出。 0表示客户端有序地关闭连接。

相关问题