【问题标题】:C++ network programing in linux: Server Questionslinux中的C++网络编程:服务器问题
【发布时间】:2010-10-13 13:56:47
【问题描述】:

我正在学习如何使用 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

【问题讨论】:

  • 好吧,我们不知道您在接收和发送之间做了什么。给我们更多细节!
  • 等等,我重新阅读了您的问题,问题是它有时会在收到字符串时回显该字符串,有时它会发送另一个您希望它发送的已处理响应?如果是这样,那么问题出在处理程序中,而不是在这段代码中......
  • 我已经非常广泛地测试了处理程序和处理程序使用的方法。不过我会把它贴出来让你看看。

标签: c++ c linux sockets tcp


【解决方案1】:

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

如果您从客户端发送()一些大数据,您可能需要在服务器上使用多个 recv()(反之亦然)来读取所有数据。这与文件通常的工作方式有很大不同...

如果您正在设计自己的协议,您还可以选择发送消息长度,例如 [LEN][message]。一个简单的例子是,如果您发送的字符串被限制为 256 个字节,您可以从 send() 开始代表字符串长度的 short

或者更简单,决定使用换行符(换行符 - \n)来终止消息。协议看起来像

"msg1\nmsg2\n"

那么你将不得不recv(),并附加数据,直到你得到一个换行符。这就是我现在所能收集到的全部内容,互联网上有很多很好的例子,但我建议你获取一些“真实”程序的源代码,看看它是如何处理网络的。

【讨论】:

  • 另外,不要假设 send() 可以发送您的整个消息,您必须循环调用 send() 直到您的所有数据都已发送...
  • 是的,我的协议很短,我现在只是在测试它。如果您不介意向我发送一些很好的代码示例链接,那就太好了。我只能找到并没有太大帮助的 echo 服务器/客户端示例。
  • 反之亦然,如果您使用 10 次 send() 调用发送 10 条消息,您可能会通过一次 recv() 调用读取其中的 9 条半。
【解决方案2】:

您呼叫handleMessage 两次。您没有发布代码,但看起来您正在返回 string。这样做可能会更好:

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

这将避免重复发生在handleMessage 中的任何操作。

【讨论】:

  • 是的,我在你说什么之前就切换了这个,但问题是不知道为什么调用它两次会这样做,但也不知道为什么我一开始就这样称呼它很糟糕。饥饿时工作 5 个小时以上的代码可能是一个原因。谢谢
  • 它也可能与指向临时对象的悬空指针有关,该对象随后被销毁。仔细查看handleMessage() 中的代码。
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2021-10-04
  • 1970-01-01
  • 2011-05-07
  • 2013-03-12
相关资源
最近更新 更多