我使用VS 2008来实现从客户端获取套接字连接的服务器。 我为此使用了MSDN示例代码,它第一次对我有用。 来自客户作者的信息是,在第一次请求之前,它尝试握手,然后发送第一个请求。我真的很好。 之后我将响应发送给客户端,并获得它。 但现在我的问题开始了: 客户开始向我发送请求,但我一无所获! 我不确定我的实现,因为在MSDN示例中只有一个请求。 任何人都可以解释在获得第一个请求和第二个请求之间应该有什么区别?我应该为每个请求使用Socket.Accept(),还是在从Socket.Accept()函数获取检索到的套接字后,我只使用Socket.Receive()?
我的代码基于MSDN样本在这里:
listener.Bind(localEndPoint);
listener.Listen(10);
// Start listening for connections.
Console.WriteLine("Waiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
SocketError errorCode;
// An incoming connection needs to be processed.
while (true)
{
bytes =new byte[1024];
handler.ReceiveTimeout = 2000;
int bytesRec = handler.Receive(bytes,0,1024,0,out errorCode);
data +=Encoding.ASCII.GetString(bytes, 0, bytesRec);
Console.WriteLine("Text received : {0}", data);
string answer = "my answer to client";
// Echo the data back to the client.
byte[] msg = Encoding.ASCII.GetBytes(answer);
handler.Send(msg);
}
我的结果是第一次以bytesRec获取一些数据并将响应发送给客户端。然后我再没有得到任何东西到bytesRec,但收到的由于超时错误中止。
提前致谢,
答案 0 :(得分:1)
您拨打Socket.Receive()
的次数与接收每封邮件的次数相同,然后继续调用它以接收下一条消息,依此类推。
请注意,在连接的一端调用Receive()
不,与另一端{sup> 1的Send()
的调用一一对应。如果你想发送“消息”,通常由你来决定在套接字的顶部实现这个 - 通过例如使用固定长度的消息等为每条消息添加前缀,或者使用更高级别的网络原语。
1 因此,对Receive()
的单个调用可能只检索部分消息,或检索多个消息,或检索一条消息的结尾,一条或多条完整消息,以及开始另一条消息,等等。