socket连续两次调用sendTo

lijing2001 2005-02-25 04:46:18
客户端:
string str = "Hello ";
string str1 = "World";

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint localPoint1 = new IPEndPoint(IPAddress.Parse("10.46.255.100"),60000);
EndPoint tempPoint1 = (EndPoint)localPoint1;

socket .SendTo(System.Text.Encoding.Default.GetBytes(str),tempPoint1);
//Thread.Sleep(1000);
socket .SendTo(System.Text.Encoding.Default.GetBytes(str1),tempPoint1);

服务器端:
while(true)
{
Length = socket.ReceiveFrom(recvBuffer,ref tempPoint);

Thread thread = new Thread(new ThreadStart(DistributeMsg));
thread.Start();
}
private void DistributeMsg()
{
byte[] buffer = new byte[Length];
Array.Copy(recvBuffer,0,buffer,0,Length);

Console.WriteLine(System.Text.Encoding.Default.GetString(buffer));
}

以上客户端和服务器都是本机。

输出结果:
World
World

如果加上Sleep(1000),输出正常,为什么?
...全文
831 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steven_luo 2005-03-25
  • 打赏
  • 举报
回复
流式的,不是包式的
storm97 2005-02-25
  • 打赏
  • 举报
回复
显然,你不加Thread.Sleep(1000);时,这两个消息基本是同时发出的,但是你的服务器端在同一时间只处理了一个消息,如果要不加Thread.Sleep(1000);而且要让服务器接收处理所有的Socket消息,那么你就必须使用异步方式来发送和接受消息,即使用BeginSend和BeginReceive,
如果加上Thread.Sleep(1000);那么直接使用send就没有问题,原因是客户端发送完第一条数据后,间隔1s再次发送,这时服务器已经处理完上一个Socket消息,Socket端口空闲,他会处理再次发送的消息,除非人为,否则服务器不会为这些Socket消息自动排队。
zhouabc 2005-02-25
  • 打赏
  • 举报
回复

挺怪的,哈哈.
xixigongzhu 2005-02-25
  • 打赏
  • 举报
回复
Sleep(1000)的时间延长作用能够使得第一次发送有充足的时间发送数据;如果没有这个时间延长,第一次还没有发送完第二次就开始发送,这个时候第二次发送的数据覆盖了第一次发送的,所以接收方只收到了第二次发送的数据。
Night_Elf 2005-02-25
  • 打赏
  • 举报
回复
up

111,094

社区成员

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

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

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