Linux中的C ++网络编程:服务器问题

时间:2010-10-13 13:56:47

标签: c++ c linux sockets tcp

我正在学习如何使用c / c ++进行网络编程,我创建了一个服务器(TCP),假设以特定的方式响应来自客户端的消息,为了做到这一点,我创建了一个服务器类通过的类消息到并返回一个字符串以报告回客户端。

这是我的问题,如果只重复我发送给消息处理程序的内容,有时会报告其他时间正确的字符串。我没有在代码中的任何地方返回传入的内容。所以我想知道我是否正确处理消息?

其次,我不确定如何在while循环中保持连接打开以不断地来回传递消息。您可以在下面的代码中看到我是如何做到的,但我很确定这是不正确的,对此的任何帮助都会很棒。谢谢!

if (!fork())
    { // this is the child process
        close(sockfd); // child doesn't need the listener

        while ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) > 0)
        {
            //numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0);

            buf[numbytes-1] = '\0';
            const char* temp = ash.handleMessage(buf).c_str();
            int size_of_temp = ash.handleMessage(buf).length();
            send(new_fd, temp, size_of_temp, 0);

            //send(new_fd, temp, size_of_temp+1, 0);
        }
    }//end if

请原谅我的贫民窟代码

Handles the message

Class Method handler uses

2 个答案:

答案 0 :(得分:2)

如果您了解套接字,您还应该知道您不能假设您发送的内容()作为“完整消息”,将作为完整消息发送。

如果从客户端发送()一些大数据,则可能需要在服务器上使用多个recv()(反之亦然)才能全部读取。这是文件通常如何工作的一个很大的区别......

如果你设计自己的协议,你可以选择发送消息长度,如[LEN] [消息]。一个简单的例子是,如果您发送的字符串限制为256个字节,则可以使用send()表示字符串长度的 short 开始,

或者更容易,决定使用换行符(换行符 - \ n)来终止邮件。该协议看起来像

“MSG1 \ nmsg2 \ n” 个

然后你必须recv(),并附加数据,直到你得到换行符。这就是我现在所能提出的所有内容,互联网上有很多很好的例子,但是我建议获取一些“真实”程序的来源,看看它如何处理它的网络。

答案 1 :(得分:1)

您正在拨打handleMessage两次。您没有发布代码,但看起来您正在返回string。这可能更好:

        string temp = ash.handleMessage(buf);
        int size_of_temp = temp.length();

这样可以避免重复handleMessage中发生的任何操作。