等待C ++客户端套接字应用程序中的传入数据

时间:2015-03-25 20:09:24

标签: c++ linux sockets g++

通过教程,我能够构建一个连接到服务器并能够发送和接收数据的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循环吗?或者还有其他。让客户端应用程序继续监听数据的更好方法?

2 个答案:

答案 0 :(得分:1)

您应该检查您是否在某个时刻收到0个字节,这意味着另一端已关闭连接并且不再发送。这意味着您也可以关闭套接字并关闭应用程序。

在正常情况下,当服务器也在运行时,接收是一个阻塞呼叫,它只是挂起,直到收到任何东西。

现在,如果服务器关闭了连接,你真的必须退出无限循环,否则你将继续在一个已经关闭的套接字上调用receive,这将立即返回你的cpu上的大量负载。

所有程序通常应该处理错误情况或发生意外行为。

答案 1 :(得分:0)

是的,你应该把接收放在一个循环中。但是你应该知道接收调用将阻止你的程序,直到它找到任何数据。这意味着如果您正在使用GUI,您的GUI将暂停,直到接收将取消阻止该程序。对于控制台应用程序,它确定..