我實際上使用TCP Select嘗試了客戶端服務器代碼。我不知道爲什麼在打印服務器爲什麼在服務器代碼中打印垃圾值
這裏從客戶端的每個請求後打印的垃圾值是服務器代碼 https://www.dropbox.com/s/qgd87fby6tif9q6/server.c
這裏是客戶端代碼 https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c
我實際上使用TCP Select嘗試了客戶端服務器代碼。我不知道爲什麼在打印服務器爲什麼在服務器代碼中打印垃圾值
這裏從客戶端的每個請求後打印的垃圾值是服務器代碼 https://www.dropbox.com/s/qgd87fby6tif9q6/server.c
這裏是客戶端代碼 https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c
你」將服務器上收到的消息重新視爲字符串,但不會從客戶端發送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';
}
到客戶端,它調用fgets
和send
之間將其刪除。
https://www.dropbox.com/s/1jp57eo8ppele91/Screenshot%20at%202012-12-12%2003%3A10%3A26.png正如你在「1234」垃圾值顯示後的屏幕截圖中看到的那樣。 ..我想刪除那個垃圾值! –
@ sam_3191好的,我現在看到了什麼問題。我更新了我的回答 – simonc
@simoc非常感謝......它的運行完美。我只有一個更多的查詢。現在我想從服務器發回客戶端的字符串。在這種情況下我應該做什麼! –
歡迎來到SO。這不是一個代碼審查網站,但對於技術問題和答案,請提出更具體的問題。 –