2016-01-02 47 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); 

- 在这里>也:经常检查返回代码。