我正在学习如何使用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
发布于 2010-10-14 00:11:20
您正在调用handleMessage两次。您没有发布代码,但看起来您将返回一个string。这样做可能更好:
string temp = ash.handleMessage(buf);
int size_of_temp = temp.length();这将避免重复在handleMessage中发生的任何操作。
发布于 2010-10-13 22:12:33
如果你学习套接字,你也应该知道,你不能假设你发送的()作为一个“完整的消息”,将作为一个完整的消息来传递。
如果您从客户端发送()一些大数据,您可能需要在服务器上使用多个recv() (反之亦然)来读取所有数据。这与文件通常的工作方式有很大的不同……
如果你正在设计你自己的协议,你也可以选择发送消息的长度,比如LEN。一个简单的例子是,如果您发送的字符串被限制为256个字节,您可以从send ()开始,发送一个代表字符串长度的短值。
或者更简单,决定使用换行符(newline - \n)来终止消息。协议看起来会像这样
“消息1\nmsg2\n”
然后,您必须使用recv(),并追加数据,直到得到换行符。这就是我现在所能收集到的全部,在互联网上有很多很好的例子,但我建议你获取一些“真正”程序的源代码,看看它是如何处理它的网络的。
https://stackoverflow.com/questions/3924459
复制相似问题