2010-10-13 72 views
1

我正在学习如何使用c/C++网络程序,并且我已经创建了一个服务器(TCP),它假设以特定方式响应来自客户端的消息以执行此操作创建了一个服务器类将消息传递给该类并返回一个字符串以返回给客户端的类。在Linux中的C++网络编程:服务器问题

这是我的问题有时它会报告正确的字符串回其他时间,如果只是重复我发送到消息处理程序。哪里没有在代码中我有它返回什么传入。所以我想知道我处理正确的消息?

其次,我不确定如何在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

+0

好吧,我们不知道你在recv和send之间做了什么。给我们更多的细节! – slezica 2010-10-13 14:03:10

+0

等一下,我重新阅读你的问题,问题是它有时候会像字符串一样回应字符串,有时它会发送另一个你希望它发送的处理后的回应?如果是这样,那么问题是在处理程序,而不是在这段代码... – slezica 2010-10-13 14:05:46

+0

我已经测试处理程序和处理程序使用相当广泛的方法。我会张贴它,所以你可以看到。 – Pieces 2010-10-13 14:12:01

回答

1

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

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

这将避免重复,发生在handleMessage任何行动。

+0

是的,我在你说什么之前切换了这个,但是这个问题不知道为什么调用它两次会做到这一点,但也不知道为什么我首先把它称为糟糕的。在饥饿的情况下工作5个小时以上的代码可能是一个原因。谢谢 – Pieces 2010-10-13 17:29:17

+0

它也可能与悬挂指针指向临时对象然后被销毁有关。再看看'handleMessage()'中的代码。 – bstpierre 2010-10-13 18:55:09

2

如果您对插座的学习,你也应该知道,你不能想当然地认为你发送的()为“完整信息“,将作为完整信息发送。

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

如果你正在设计自己的协议,你可以选择发送消息长度,如[LEN] [消息]。一个简单的例子是,如果您发送的限制为256个字节的字符串您可以发送启动()荷兰国际集团一代表字符串长度,

或更容易,决定你用线饲料(换行符 - \ n)终止消息。该协议将类似于

“MSG 1 \ nmsg2 \ n”个

,那么你就必须的recv(),并追加数据,直到你得到一个换行符。这就是我现在所能想到的,互联网上有很多很棒的例子,但我会建议找到一些“真正的”程序的来源,看看它如何处理它的网络。

+0

也不要假设send()可以发送你的整个消息,你必须在一个循环中调用send(),直到所有的数据都被发送出去为止 – 2010-10-13 14:13:34

+0

是的,我的协议很短,我只是测试它马上。如果你不介意给我一些好的代码示例的链接。我只能找到回应服务器/客户端的例子,这些例子并没有真正帮助那么多。 – Pieces 2010-10-13 14:19:57

+0

它也可以用另一种方式工作,如果使用10次send()调用发送10条消息,则可以通过一次recv()调用读取其中的9个半数。 – nos 2010-10-13 16:21:17