2016-01-02 49 views
1

我有以下代碼:套接字接收卡在環

while (true) 
{ 
    recv(server, buffer, BUFFER_LENGTH, 0); 
    cout << buffer; 
} 

我期待發生的事情是,當我的客戶端發送數據到服務器爲它接收到的數據,輸出它,然後回去嘗試接收更多的數據,但它實際上從未到達cout線。如果我刪除循環它可以正常工作,爲什麼while循環使RECV永遠不會結束..?

發送代碼:

while (true) 
{ 
    cin >> buffer; 
    send(client, buffer, BUFFER_LENGTH, 0); 
} 

由於

+1

請提供完整的代碼。另外,是什麼讓你如此確信線路沒有到達?此外,緩衝區似乎是一個'char *'或類似的東西,是什麼讓你認爲它是零終止的,按照'strlen()'的要求來工作? –

回答

1

std::cout被緩衝,所以輸出是不是直接可見的。
嘗試

std::cout << buffer << std::flush; 

改爲。

至於爲什麼循環永不結束:默認情況下,套接字處於阻塞模式,所以只要有一些數據可用,並且只返回,recv就會等待。
您必須將server套接字移至非阻塞模式或只讀一次。

+0

謝謝,沖洗工作。但是我不完全明白爲什麼,我得到RECV阻塞,我希望阻塞它,但是不應該在我將數據發送到服務器時阻止阻塞? – user1157885

+0

不可以。您的意思是「發送數據到服務器」只是一個「發送」調用,對吧?爲什麼**應該**呢? – Downvoter

+0

在他提到的Danny_ds消息中,只要「沒有數據」就會阻止它。通過運行send函數並不是用數據填充緩衝區,因此應該停止阻塞? – user1157885

1

首先,你總是要檢查返回值recv()

然後,如果您使用的是std::cout,則必須確保buffer以null結尾。

recv()只要沒有數據或發生錯誤(或連接關閉,超時等)就會阻塞。

更新(發送添加的代碼)

cin >> buffer; 

- >您可能導致緩衝區溢出這裏..

send(client, buffer, BUFFER_LENGTH, 0); 

- 在這裏>也:經常檢查返回代碼。