在 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 将停止,直到接收解除对程序的阻塞。对于控制台应用程序没问题..