这段代码为何有时候会报错?(socket error=10040)

fiterzs 2015-09-06 04:48:05

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个字节,请大家帮忙看看哪里出问题了?
...全文
510 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiterzs 2015-09-09
  • 打赏
  • 举报
回复
谢谢大家的帮助
fiterzs 2015-09-09
  • 打赏
  • 举报
回复
貌似现在正常了,原因估计是我调试机发的数据包太大了
fiterzs 2015-09-07
  • 打赏
  • 举报
回复
我把buff 该成了4096 目前正在运行测试中...... 比较奇怪的问题,理论上服务器发送数据包的大小肯定不会超过1024个字节
Forty2 2015-09-07
  • 打赏
  • 举报
回复
引用 楼主 fiterzs 的回复:
; buffer = new byte[1200]; ... socket 有时候会报接受缓冲区太小,10040的错误,服务器上发的每数据包大小不会超过1200个字节,请大家帮忙看看哪里出问题了?
因为UDP是不用连接的,不能排除其他机器发信息到你的UDP端口。 UDP包的理论最大值可以接近64K,因此你用1200字节的缓冲区是有可能出现10040(MessageSize)错误。 解决方法有两个: 一、(比较好)buffer = new byte[65535]; 二、(当你坚持不改缓冲区太小)如果能确认服务器的数据包一定不超过1200个字节,也可以选择忽略10040错误。
  • 打赏
  • 举报
回复
楼上答案 试试
fiterzs 2015-09-06
  • 打赏
  • 举报
回复
与buffer无关啊,每次收到数据后new buffer也是一样
Poopaye 2015-09-06
  • 打赏
  • 举报
回复
buffer太小
fiterzs 2015-09-06
  • 打赏
  • 举报
回复
这个问题困扰我好几天了,求大家帮忙!貌似在另外一台机子上出现问题的概率小些

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧