【发布时间】:2012-04-22 07:40:30
【问题描述】:
目前我正在用 C++ 创建一个客户端服务器控制台应用程序。使用winsock2.h库和UDP协议,我们使用sendto和recvfrom将消息作为字符串从客户端发送到服务器,然后服务器将消息发送到不同的客户端,如果客户端1发送向 client2 发送消息,client2 在尝试向 client1 发送消息之前不会收到该消息。我希望让程序像即时通讯工具一样工作,这样当客户端 1 向客户端 2 发送消息时,客户端 2 几乎会立即收到它,而无需先发送消息。
此外,如果客户端 1 向客户端 2 发送消息,客户端 1 将无法发送另一条消息,除非客户端 2 已回复第一个消息。
如果您需要更多信息或查看一些代码,请询问。
发送代码:
while( getline( cin, line ) )
{
// send a string to the server.
sendto( hSocket, line.c_str(), line.size(), 0,
reinterpret_cast<sockaddr*>( &serverAddress ),
sizeof( serverAddress ) );
// recieve the response.
int n = recvfrom( hSocket, recvLine, MAXLINE, 0, NULL, NULL );
if( n == -1 )
{
cout << "no reply" << endl;
}
else
{
recvLine[n] = 0;
string const terminateMsg = "server exit";
string msg = recvLine;
if( msg == terminateMsg )
{
cout << "Server terminated" << endl;
break;
}
cout << n << ": " << recvLine << endl;
}
}
【问题讨论】:
-
见Boost.ASIO。它甚至带有an example 用于这种确切的场景。
-
@ildjarn 谢谢你,他们的例子是我想要的,但我更愿意坚持使用 winsock 库
-
那么你要做更多(非常丑陋)的工作。 ;-]
-
你能发布一些代码,特别是 Socket 设置和发送的代码吗?我冒昧地猜测它实际上并没有将数据发送到网络堆栈,直到您尝试阅读,反之亦然。
标签: c++ udp client-server chat winsock