通过教程,我能够构建一个连接到服务器并能够发送和接收数据的C ++客户端应用程序。
目前,应用程序在从服务器收到字符串后结束。我想做的是让客户端继续监听传入的数据。
目前我的代码的一部分如下所示:
string tcp_client::receive(int size=512)
{
char buffer[size];
string reply;
//Receive a reply from the server
if( recv(sock , buffer , sizeof(buffer) , 0) < 0)
{
puts("recv failed");
}
reply = buffer;
return reply;
}
int main(int argc , char *argv[])
{
tcp_client c;
string host;
cout<<"Enter hostname : ";
cin>>host;
c.conn(host , 4004);
//send some data
c.send_data("TEST STRING \n\r\n");
//receive and echo reply
// (want to keep listening here for data)
cout<<c.receive(1024);
//done
return 0;
}
我不希望客户端结束,但我希望它继续监听数据。我正在考虑添加此代码:
while(buffer = c.receive(1024))
{
// do something with buffer ... switch/case construction
// After that, start listening again
}
首先,我不确定这是否有效。但其次,我也不确定在那里放入一个永无止境的while循环是否明智(永远不会结束,直到我终止应用程序)。
我可以像这样简单地放入一个while循环吗?或者还有其他。让客户端应用程序继续监听数据的更好方法?
答案 0 :(得分:1)
您应该检查您是否在某个时刻收到0个字节,这意味着另一端已关闭连接并且不再发送。这意味着您也可以关闭套接字并关闭应用程序。
在正常情况下,当服务器也在运行时,接收是一个阻塞呼叫,它只是挂起,直到收到任何东西。
现在,如果服务器关闭了连接,你真的必须退出无限循环,否则你将继续在一个已经关闭的套接字上调用receive,这将立即返回你的cpu上的大量负载。
所有程序通常应该处理错误情况或发生意外行为。
答案 1 :(得分:0)
是的,你应该把接收放在一个循环中。但是你应该知道接收调用将阻止你的程序,直到它找到任何数据。这意味着如果您正在使用GUI,您的GUI将暂停,直到接收将取消阻止该程序。对于控制台应用程序,它确定..