下面我從我的服務器代碼和客戶端代碼中有一段代碼。我的客戶端向成功接收的服務器發送一個整數,然後向服務器發送一個長度爲str_len的字符串。服務器中的第二次讀取不起作用,它阻塞並且沒有讀取任何內容。當我退出客戶端時,服務器打印它沒有讀取任何東西。哪裏不對?兩次連續的套接字讀取,二次讀取不起作用
//Server code
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
unsigned int *length = new unsigned int;
memcpy(length, buffer, sizeof(int));
cout << "Length : " << *length << endl;
int len = *length + 1;
char buffIn[len+1];
bzero(buffIn,len);
//ok msg?
n = read(newsockfd,buffIn,len);
if (n < 0) error("ERROR reading from socket");
cout << "value of n" << n << endl;
printf("Received : %s\n", buffIn);
//client method
void send(string req)
{
//Send string len
unsigned int str_len = req.length();
//str_len = 3000;
write(socketFd, &str_len, sizeof(str_len));
//Send string
const char *str_req = req.c_str();
printf("%s\n",str_req);
cout << "Str len is : " << strlen(str_req) << endl;
write(socketFd, str_req, strlen(str_req) + 1);
cout << "write done " << endl;
}
你有沒有檢查第一次讀了多少字節接收?這兩個發送命令的數據很有可能在一個包中發送和接收,因此在第一次讀取之後已經交給應用程序。 – junix 2013-02-24 00:08:44
你讀取的字符串長度爲從套接字讀取255個字節,因此拉入數據的前251個(假設爲32位整數)。所以當你詢問字符串的其餘部分時,你會要求額外的251個字節,它們不會被髮送,因此讀取的調用塊 – Dampsquid 2013-02-24 00:09:51
只是使用「unsigned int length; n = read(newsockfd,&length,sizeof(length)); 「 – Dampsquid 2013-02-24 00:15:00