这段代码为啥有时候会报错?(socket error=10040)
这段代码为何有时候会报错?(socket error=10040)
EndPoint remoteIPE = (EndPoint)serverpoint;
server = new Socket( AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
server.Bind(serverpoint);
m_regex = new Regex("<([0-9]{1,3})>", RegexOptions.Compiled);
// socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,onrecvdata,socket);
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteIPE, onrecvdata, server);
private void onrecvdata(IAsyncResult ar)
{
Socket server = (Socket)ar.AsyncState;
if (server != null)
{
EndPoint remoteIPE = (EndPoint)serverpoint;
int readbyte = server.EndReceiveFrom(ar, ref remoteIPE);
string remoteaddress = remoteIPE.ToString();
string str = Encoding.UTF8.GetString(buffer, 0, readbyte);
if (readbyte > 0)
{
// recvstr.Append(str);
//Logview.Invoke(new TestDelegate(DelegateMethod), "\n收到客户端数据:" + str + readbyte + " 字节");
MessageStruct tmpReturn = new MessageStruct(str,remoteIPE);
string ss = tmpReturn.ToString();
// Log(remoteIPE, str);
Console.WriteLine("收到{2}数据:{0},长度:{1}字节", str, readbyte,remoteaddress);
// buffer = new byte[1200];
buffer = new byte[1200];
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteIPE, new AsyncCallback(onrecvdata), server);
}
else
{
server.Close();
}
}
}
socket 有时候会报接受缓冲区太小,10040的错误,服务器上发的每数据包大小不会超过1200个字节,请大家帮忙看看哪里出问题了?
------解决思路----------------------
buffer太小
------解决思路----------------------
因为UDP是不用连接的,不能排除其他机器发信息到你的UDP端口。
UDP包的理论最大值可以接近64K,因此你用1200字节的缓冲区是有可能出现10040(MessageSize)错误。
解决方法有两个:
一、(比较好)buffer = new byte[65535];
二、(当你坚持不改缓冲区太小)如果能确认服务器的数据包一定不超过1200个字节,也可以选择忽略10040错误。
EndPoint remoteIPE = (EndPoint)serverpoint;
server = new Socket( AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
server.Bind(serverpoint);
m_regex = new Regex("<([0-9]{1,3})>", RegexOptions.Compiled);
// socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,onrecvdata,socket);
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteIPE, onrecvdata, server);
private void onrecvdata(IAsyncResult ar)
{
Socket server = (Socket)ar.AsyncState;
if (server != null)
{
EndPoint remoteIPE = (EndPoint)serverpoint;
int readbyte = server.EndReceiveFrom(ar, ref remoteIPE);
string remoteaddress = remoteIPE.ToString();
string str = Encoding.UTF8.GetString(buffer, 0, readbyte);
if (readbyte > 0)
{
// recvstr.Append(str);
//Logview.Invoke(new TestDelegate(DelegateMethod), "\n收到客户端数据:" + str + readbyte + " 字节");
MessageStruct tmpReturn = new MessageStruct(str,remoteIPE);
string ss = tmpReturn.ToString();
// Log(remoteIPE, str);
Console.WriteLine("收到{2}数据:{0},长度:{1}字节", str, readbyte,remoteaddress);
// buffer = new byte[1200];
buffer = new byte[1200];
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteIPE, new AsyncCallback(onrecvdata), server);
}
else
{
server.Close();
}
}
}
socket 有时候会报接受缓冲区太小,10040的错误,服务器上发的每数据包大小不会超过1200个字节,请大家帮忙看看哪里出问题了?
------解决思路----------------------
buffer太小
------解决思路----------------------
因为UDP是不用连接的,不能排除其他机器发信息到你的UDP端口。
UDP包的理论最大值可以接近64K,因此你用1200字节的缓冲区是有可能出现10040(MessageSize)错误。
解决方法有两个:
一、(比较好)buffer = new byte[65535];
二、(当你坚持不改缓冲区太小)如果能确认服务器的数据包一定不超过1200个字节,也可以选择忽略10040错误。