2011-11-20 51 views
0

這一直在殺死我,而我對c/C++的經驗不足也是原因。發送和讀取線程之間的字符串

我無法弄清楚如何從另一個線程讀取字符串。在這種情況下,線程來自連接到服務器線程的客戶端。我已經能夠毫無問題地通過整合。似乎無法弄清楚如何讓字符串通過然而。

客戶端誰從控制檯字符串中讀取並需要發送到服務器:

cout << "Enter in an operation and number: \n "; 
int x; 
char str[20]; 
int len = strlen(str); 
int result; 


cin>>str; 
cin>>x; 

write(client_sock, &len, sizeof(int)); 
write(client_sock, str, len); 
write(client_sock, &x, sizeof(x)); 

read(client_sock, &result, sizeof(result)); 
cout<<result; 
需要閱讀的字符串,用於測試我試圖把它送回來,但是我需要閱讀

服務器端它,並將它與其他條件,結轉庫存操作上的數字我讀。

int result; 
int input; 
int len; 
char str; 

read(client_sock, &input, sizeof(input)); 
read(client_sock,&len,sizeof(len)); 
char buf[sizeof(len)]; 
sscanf(buf, "%s", &str); 

cout<<str; 
result= input*input; 

write(client_sock,&result,sizeof(result)); 
write(client_sock, buf, strlen(buf)); 
當然

這是一個任務,我的教授告訴我,在字符讀入緩衝區和空終止它。我不知道他是什麼意思,由null終止..也我正確地讀入緩衝區?

回答

1

這裏有一些指針

你需要做同樣的步驟都當你寫和讀

例如首先在套接字上寫下字符串的長度(字節數),我想在你的情況下,單個字節應該足以描述長度,然後把字符串寫成一系列字節。如果你希望有更大的字符串使用數據類型的長度是明確的,而不是int,例如做你自己的類型,並記住,如果你在平臺之間進行通信,你可能需要考慮endianness

你有這麼遠在寫作方面有什麼似乎確定(我猜你離開了開/結合的插座等):你先閱讀長度的接收端

write(client_sock, &len, sizeof(unsigned char)); 
write(client_sock, str, len); 

,那麼下面的字節數:

read(client_sock, &len, sizeof(unsigned char)); 
char* buffer = new char[len + 1]; // create a buffer 
read(client_sock, buffer, len); 
buffer[len]='\0'; // terminate the string 

現在你得到了緩衝區中的字符串,只是將其轉換爲std :: string。

std::string s = buffer; 
delete [] buffer; 

[免責聲明:不打算編寫完成或編譯的只是爲了顯示原理]

這些都是不正確的語句:

char buf[sizeof(len)]; 
sscanf(buf, "%s", &str); 

BUF是未初始化的並且太小,因爲sizeof(len)將返回只有int的大小,並且您實際上正在從未初始化的緩衝區中讀取一個字節的空間爲一個字節的字符串。這裏不需要sscanf。

+0

中讀取的字符串的大小真棒,非常感謝您的幫助! – user975044

0

一個空結束的字符串是一個標準的C字符串......一連串字符,其次是作爲一個普通的ASCII字符串「Hello」空字節

會是什麼樣子

0x48(H)
0x65(E)
0x6c(升)
0x6c(升)
0x6f(O)
0×00(NULL)

你可以看到,你需要的緩衝區您的字符串長度+ 1個字節(空終結)

+0

謝謝,但這幾乎沒有幫助..我只是將緩衝區大小設置爲buf [sizeof(len)+1] ... len是在 – user975044

0

幾點意見:

cout << "Enter in an operation and number: \n "; 
int x; 
char str[20]; 
int len = strlen(str); 
int result; 

我不知道C++,但是C不會自動歸零內存爲您服務。您的char str[20] ; int len = strlen(str);正在運行strlen(3)隨機內存。它可能包含一個字符串。它可能包含前一個調用堆棧的函數指針。它當然包含垃圾,並且在其上調用strlen()也會產生垃圾 - 甚至可能是分段違規。

char str; 
/* ... */ 
char buf[sizeof(len)]; 
sscanf(buf, "%s", &str); 

同樣,你分配一個字符緩衝區,並立即把它,未初始化,以sscanf(3)sscanf(3)將會閱讀垃圾,它可能是正確的。

此外,您試圖將字符串存儲爲單個字節(char str)。您需要(a)將char str更改爲char *str(b)實際爲其分配一些內存。但是,也許strdup(3)函數會更有用,因爲這看起來像只是試圖複製字符串。

相關問題