2012-11-26 52 views
1

在C中,我要求服務器打印它接收到的任何消息的內容。所有消息均遵循以下格式:「消息:/計數器/」。C:printf非打印 n

while (1){ 
      length = sizeof(struct sockaddr); 
    /*  receive from client */ 
      lenstr = recv(newfd, buff, 20000, 0); 
      if (lenstr == -1){ 
       perror("recv(): "); 
       exit(1); 
      } 
      buff[lenstr] = '\0'; 
      printf("Received: %s \n", buff); 
    /*  send back to client*/ 
      if (send(newfd, buff, lenstr, 0) < 0){ 
       perror("send(): "); 
       exit(-1); 
      } 

當我運行服務器時,消息一個接一個地出現,而不需要換行。我在這裏錯過了什麼? (這裏的連接是TCP) 謝謝。

+8

如果這是TCP,也許一個recv()調用讀取從客戶端發送的許多行。 TCP只是一個字節流,它不會在消息或數據包中爲您分割數據,這取決於您是否需要它。 – nos

+0

哦,我明白了。所以這個換行符出現在我可能的完整緩衝區的末尾,對吧? –

+1

是的,當你調用recv()時,你的緩衝區將包含很多可用的數據,這個數據可能是來自很多send()調用的數據(或者來自send()調用的部分數據) – nos

回答

0

TCP沒有「消息」,它處理雙向連續的字節流。您只是閱讀收到的數據,直到當時和您的2000年。也許你真的想要Stream Control Transmission Protocol?或者標記消息以某種方式結束(可能是'\ n'),並逐字讀取?或者只是讀一條消息的長度(如果它們是固定長度的,那是)?

2

它從套接字接收的數據可能包含零或控制字符。這些不應該打印。

嘗試使用以下功能將接收的數據轉儲到stdout。它用一個點代替所有不可打印的字符:

void dump_buf(char const* buf, size_t buf_len) { 
    char const* buf_end = buf + buf_len; 
    while(buf != buf_end) { 
     char c = *buf++; 
     putchar(isprint(c) ? c : '.'); 
    } 
    putchar('\n'); 
} 

// ... 

lenstr = recv(newfd, buff, 20000, 0); 
if (lenstr == -1) { 
    perror("recv(): "); 
    exit(1); 
} 
dump_buf(buff, lenstr); 
+0

+1 isprint判斷()。很好地放。 – twobob