2012-12-12 48 views
-2

我實際上使用TCP Select嘗試了客戶端服務器代碼。我不知道爲什麼在打印服務器爲什麼在服務器代碼中打印垃圾值

這裏從客戶端的每個請求後打印的垃圾值是服務器代碼 https://www.dropbox.com/s/qgd87fby6tif9q6/server.c

這裏是客戶端代碼 https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c

+0

歡迎來到SO。這不是一個代碼審查網站,但對於技術問題和答案,請提出更具體的問題。 –

回答

0

你」將服務器上收到的消息重新視爲字符串,但不會從客戶端發送nul終止符。這會導致recv_buf中的舊內容,並且可能會進一步向下顯示堆棧,因爲printf會掃描內存以查找值爲0的下一個字節。您可以通過從客戶端發送nul終止符來更改send調用以包含字符串終止符在您的消息

send(sockfd, send_buf, strlen(send_buf) + 1, 0); 

或通過接收消息

recv_buf[nbytes_recvd] = '\0'; 

[原創回答以下保留的情況下,後加入NUL終止的服務器你也想從郵件中刪除的換行符。而且因爲這會無意間固定您的問題。]

「垃圾值」並沒有給我們提供了很多去...

在猜測,這些字符可能是換行符(單字節字符值0x0D)。從fgets man page(我的強調)

fgets()從流中最多讀入一個小於size的字符並將它們存儲到s指向的緩衝區中。讀取在EOF或換行符後停止。 如果讀取換行符,則將其存儲到緩衝區中。終止空字節(aq \ 0aq)存儲在緩衝區中的最後一個字符之後。

客戶端讀取的字符串可能以換行符結尾。如果您不想發送此服務器,你可以通過添加

size_t len = strlen(send_buf); 
if (len > 0 && send_buf[len-1] == '\n') { 
    send_buf[len-1] = '\0'; 
} 

到客戶端,它調用fgetssend之間將其刪除。

+0

https://www.dropbox.com/s/1jp57eo8ppele91/Screenshot%20at%202012-12-12%2003%3A10%3A26.png正如你在「1234」垃圾值顯示後的屏幕截圖中看到的那樣。 ..我想刪除那個垃圾值! –

+0

@ sam_3191好的,我現在看到了什麼問題。我更新了我的回答 – simonc

+0

@simoc非常感謝......它的運行完美。我只有一個更多的查詢。現在我想從服務器發回客戶端的字符串。在這種情況下我應該做什麼! –