socket发送完成后马上关闭,会导致服务端根本收不到数据

Squall001 2017-07-17 05:04:41
服务端那边写好了的,正常接收数据,环境是客户端在本地,服务端也在本地,只是端口不一样,做到对MVC为客户端给服务端发信息。
客户端这边我是在MVC里面开设Socket实现发送数据,我想达到的目的就是开启TCP后,链接正常后,直接发一个数据过去,然后马上关闭这个TCP连接,结果测试发现关闭太快了,导致服务端根本收不到数据就提示连接被关闭了。。。具体看下面代码


Byte[] fsSize = Encoding.UTF8.GetBytes(SendData); //SendData就是需要发送的数据
try
{
sendsocket.Connect(ep);
if(sendsocket.Connected)
{
sendsocket.Send(fsSize,SocketFlags.None);
}

//Thread.Sleep(100); 由于一次发送的数据量很少,不到100个字节,我就随意睡了100ms,
sendsocket.Shutdown(SocketShutdown.Both);
sendsocket.Close();
sendsocket.Dispose();
}
catch (Exception ex)
{
string exint = ex.Message.ToString(); //这个string只是我调试来看,出现了什么错误的
//throw;
}


我调试的时候 ,不加入那一句Thread.Sleep(100); ,服务端那边就会返回如下错误:

我第一反应就是连接被关闭了,所以我继续调试,直接下断到sendsocket.Close();那里,程序正常运行,服务端正常接收数据。因为我是下断嘛,距离Send的调用已经很久了,所以看到程序是Send出去了的。
另外微软推荐我们在关闭连接之前调用Shutdown(SocketShutdown.Both)这个函数,最后我研究了很久,本以为是大家所说的等待缓冲区接收或者发送完成,结果才发现这个只是阻止外部停止向缓冲区里面写入数据而已,并不是所谓的同步方法,等待缓冲区接收或者发送完成(当然不可能接收完成,因为这个是stream嘛,不可定的,只是停止接收而已,发送区也是同理)。

那么现在问题来了,我怎么知道服务端是否接收完成了呢?
我虽然想到,在服务端接收到信息后,服务端再反给我一个信息以示完成,但是我想用得着这么麻烦么?我这个只是需要一个简单的传输而已,所以我在想,有不有同步的方法去等待Socket发送缓冲区发送完毕,或者待它发送完毕了给我个CallBack为好(最好同步方法,让其阻塞即可)。
虽然我估计睡100ms足够发送完成了,可简单解决,但是还是想问下有不有什么其他的方法,以备以后用到
...全文
1891 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShawnBlog 2020-06-24
  • 打赏
  • 举报
回复
引用 2 楼 Milo米啊米啊米 的回复:
这就相当于你要给某个人发一个货物,你在货物装车离开后就立马把运货要用的桥给炸了,货物肯定到不了。你应该在货物到达之后,让那个人给你回个信,确认他收到了之后再炸桥。
发送消息后,关闭socket,消息可能已经在网络中了,关闭socket还能导致网络瘫痪吗?
暴打鸡排 2019-05-29
  • 打赏
  • 举报
回复
接收到一个客户端开启一个线程,线程内执行完成结束,一次通信结束。
  • 打赏
  • 举报
回复 2
这就相当于你要给某个人发一个货物,你在货物装车离开后就立马把运货要用的桥给炸了,货物肯定到不了。你应该在货物到达之后,让那个人给你回个信,确认他收到了之后再炸桥。
xdashewan 2017-07-17
  • 打赏
  • 举报
回复
建议服务器发送完成信号给客户端

110,537

社区成员

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

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

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