2016-12-02 350 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表示客戶端有序地關閉連接。

相關問題