在 C++ 客户端套接字应用程序中等待传入数据
Wait for incoming data in a C++ client socket application
通过教程,我能够构建连接到服务器并能够发送和接收数据的 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 字节,这意味着另一端已经关闭了连接并且不会再发送了。这意味着您也可以关闭套接字并关闭应用程序。
在正常情况下,当服务器也运行时,接收是一个阻塞调用,它只是挂在那里直到接收到一些东西。
现在,如果服务器关闭连接,您真的必须退出无限循环,否则您将继续在关闭的套接字上调用 receive,这将 return 立即给您的 cpu.
所有程序通常都应处理错误情况,否则可能会出现意外行为。
是的,您应该将接收置于循环中。但是您应该知道 receive 调用将阻塞您的程序,直到它找到任何数据。这意味着如果您正在使用 GUI,您的 GUI 将停止,直到接收解除对程序的阻塞。对于控制台应用程序没问题..
通过教程,我能够构建连接到服务器并能够发送和接收数据的 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 字节,这意味着另一端已经关闭了连接并且不会再发送了。这意味着您也可以关闭套接字并关闭应用程序。
在正常情况下,当服务器也运行时,接收是一个阻塞调用,它只是挂在那里直到接收到一些东西。
现在,如果服务器关闭连接,您真的必须退出无限循环,否则您将继续在关闭的套接字上调用 receive,这将 return 立即给您的 cpu.
所有程序通常都应处理错误情况,否则可能会出现意外行为。
是的,您应该将接收置于循环中。但是您应该知道 receive 调用将阻塞您的程序,直到它找到任何数据。这意味着如果您正在使用 GUI,您的 GUI 将停止,直到接收解除对程序的阻塞。对于控制台应用程序没问题..