2013-04-22 131 views
0

我正在進行套接字編程。現在,可以在客戶端服務器之間輕鬆發送和接收字節。 現在,我想在客戶端服務器之間發送字符串。以C語言在客戶端 - 服務器編程中發送字符串

,我已經用了相同的代碼是(客戶端):

strcpy(recvbuf, sendbuf); 
    send(ConnectSocket, recvbuf, strlen(recvbuf), 0); 
    printf("\nSending string..."); 

(服務器)

iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, 0); 
    recvbuf[iResult]= '\0'; 
    strcpy(sendbuf2, recvbuf); 
    printf("String recieved = %s", sendbuf2); 

但是,它沒有顯示正確的結果。 有什麼鏈接可以幫助我嗎?

+0

什麼是服務器代碼打印中的'printf'?你能指望什麼? – 2013-04-22 08:20:11

+0

您用於掃描的功能是什麼?是scanf,fgets還是什麼?什麼是printf打印?你認爲@anish在問什麼? – 2013-04-22 08:32:41

+0

你是如何定義'recvbuf'的,是'char recvbuf [NNN];'還是'char * recvbuf'? – Rohan 2013-04-22 08:35:16

回答

0

首先字符串也是字節。只要您可以輕鬆發送/接收字節,就像發送/接收字符串一樣。

更多提示。您應該知道您正在使用的TCP或UDP。使用UDP,每個send()都會發送一個數據包,recv()會收到一次數據包。但是tcp是一個字節流。這意味着send()只是將一些字節寫入流中,並且不能指望recv()實際接收多少個字節,直到它返回。您必須設計一種解碼字節流數據包的機制。說你的情況,你可以用'\ 0'拆分字符串包。

+0

是的,我正在使用TCP – 2013-04-22 09:41:06

0
recvbuf[iResult]= '\0'; 

可能是非常錯誤的,因爲iResult可能是-1,你會在數組開始前寫入,所以你會損壞內存。

除此之外,沒有更多的細節我不知道。

0

我認爲recv()被濫用。

  1. 需要檢查recv()的返回值。如果返回代碼是否定的,則不應繼續其餘行。
  2. 要獲得recv()的正值,應該設置標誌(最後一個參數)。 '0'表示接收所有長度爲「sizeof(recvbuf)-1」的字節。因此,直到接收到所有1023個字節後纔會返回代碼。
  3. 確定套接字中有多少個字節並讀取確切的字節長度。

嘗試......

int length_to_read = 0; 

length_to_read = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, MSG_PEEK); 
if(length_to_read < 0) { 
    // error 
    return; 
} 

iResult = recv(ClientSocket, recvbuf, length_to_read, 0); 
if(iResult < 0) { 
    // error 
    return; 
} 

PS。以上代碼是多餘的recv()系統調用。在一般的TCP/IP套接字編程中,您應該知道數據的確切長度。例如,前4個字節的長度和尾隨數據。爲什麼不定義c/s接口的長度?

第1步。計算數據的大小。 第2步。發送長度和數據。

第1步:讀取長度爲4字節。 第2步。讀取數據的準確長度先前計算的長度。

+0

儘管我同意你的看法,但這並不涉及這個問題。這不是OP的問題。 – 2013-04-22 11:52:41

相關問題