我正嘗試使用Linux中的C網絡編程讀取和寫入套接字。我分別在客戶端和服務器程序中成功調用「寫入」和「讀取」。使用讀取和寫入功能的C中的套接字錯誤
我很難理解的部分是,在我的客戶端程序中,我在服務器上循環並調用write 5次不同的時間,我循環並調用read 5次不同的次數。
這是預期的輸出:
MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message
這是實際的輸出:
MSG: I got your messageI got your messageMSG: I got your messageI got your messageMSG: I got your messageMSG: MSG:
正如你所看到的預期輸出和實際輸出是不同的。看起來客戶端能夠在實際發送之前調用「寫入」兩次。
這是我的客戶端代碼
for(int i=0;i<5;i++)
{
int n = write(ssocket.socketFileDescriptor,"I got your message",18);
cout<<n<<" number of bytes written."<<endl;
if (n < 0) socketError("ERROR writing to socket");
}
這是服務器代碼:
void* run(void* arg)
{
ServerSocket* ss = (ServerSocket*)arg;
//while(true)
for(int i=0;i<5;i++)
{
char buffer[256];
bzero(buffer,256);
int n = read(ss->newsockfd,buffer,256);
printf("MSG: %s",buffer);
}
close(ss->newsockfd);
}
這是除了問題,下面這是過時的,在這一點上。
我缺少一個調用刷新或什麼的?
Simulate Java's Thread class in C++
您假定TCP可以傳輸大於一個字節的消息。它不能 - 它是一個字節/八位字節的STREAMING協議,並且不知道一個字節之上的消息邊界。如果您想傳輸更大,更復雜的消息,則需要TCP上的協議。這個問題有無數次 - 這麼多,我不能看着:) – 2014-08-29 21:08:54
如果你使用的TCP套接字,然後發送的所有內容連接成一個流,當它被讀取時,你會得到什麼是可用的直到緩衝區大小)。您需要插入自己的消息邊界並在接收器中解析流。 – molbdnilo 2014-08-29 21:12:04
所以我打開wireshark並確認每個'寫'調用實際上創建了它自己的數據包。 所以這意味着閱讀是雙倍的。這是我看到'讀',我說在我的代碼中讀取256個字節。 – Matthew 2014-08-30 19:56:18