我試圖解決奇怪的C編程問題。截斷緩衝區
我在客戶端程序中輸入URL,然後將該URL傳輸到服務器程序。唯一的問題是,當服務器程序收到URL時,它丟失了前兩個字符。因此,如果網址爲http://www.google.com服務器報告收到的是「tp://www.google.com」。
奇怪的是,它不是一些部分發送問題。我正在檢查發送的字節數,並聲稱發送了整個消息。問題是,在接收端,它只聲稱它正在獲取一小部分數據。接收者報告它收到消息長度-2。這裏是在接收端的代碼:
printf("%s \n", "Connected. Receive length of URL to wget.");
if ((messageSize = recv(acceptDescriptor, &urlLength, sizeof (int), 0)) == -1) {
perror("recv URL length");
exit(1);
}
urlSizeInt = atoi(urlLength);
char url[urlSizeInt];
printf("%s %d \n", "urlSizeInt: ", urlSizeInt);
printf("%s \n", "Receive URL to wget.");
if((messageSize = recv(acceptDescriptor, &url, 13, 0)) == -1) {
perror("recv URL");
exit(1);
}
發送代碼:
printf("%s \n", "Connected");
//connected to first stepping stone in the chain.
//transfer the length of the URL
if (send(socketDescriptor, urlLengthStr, strlen(urlLengthStr), 0) == -1){
perror("send URL Length");
exit(0);
}
//transfer the URL
printf("%s %d \n", "strenlen(url): ",strlen(url));
printf("%s %s \n", "url: ",url);
int sent;
int totalSent=0;
if((sent=send(socketDescriptor, url, strlen(url), 0))==-1){
perror("send URL");
exit(0);
}
printf("%s %d \n", "sent: ",sent);
Send Output:
Connected
strenlen(url): 13
url: http://www.cs
sent: 13
Receive Output:
Connected. Receive length of URL to wget.
urlSizeInt: 13
Receive URL to wget.
messageSize: 11
URL Received: tp://www.cs
代碼來編碼長度作爲char用於發送:
char* url = "http://www.cs";
int urlLength = strlen(url);
char* urlLengthStr;
sprintf(urlLengthStr, "%d", urlLength);
發送端的代碼是什麼? –
更新了描述。請記住,如果URL的長度是13個字節,那麼發送將報告它已發送13個字節。所以它不會發送截斷的消息。 – natediggs
運行它通過查爾斯代理或wireshark什麼的,所以你可以真正看到發送。 –