关于IOCP的WSASend 同时发送2个包,第2个包客户端收不到

y66721986 2015-01-27 03:56:55
小弟最近接受IOCP,琢磨了好些天了眼看快要完成了却出现了这种问题。我是写了一个转发的服务器,收到客户端连续发来的2个数据时进行转发,我调试出WSASend时的时间,发现是同一毫秒,发送以后收到的通知信息是2个数据都发送成功。但是客户端只能收到第一个数据。
然后我试着发送第二个数据的时候延迟了500毫秒的时间,结果客户端就能收到了。这个问题真诡异,难道每次转发都得延迟500毫秒吗?那这IOCP的速度不敢想象啊。还是我哪里没理解对呢。请各们前辈帮我一下,小弟不感激不尽!
...全文
307 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-02-06
  • 打赏
  • 举报
回复
解决方案就是由收到最后一个包的那端closesocket()!!!!
y66721986 2015-02-05
  • 打赏
  • 举报
回复
我用普通的select模型写了一个,最后2个包他显示是一次发送出去的。一次发送了200字节。但是用完成端口他就分2次收到 1次189 一次11字节 我不知道怎么解了
引用 14 楼 worldy 的回复:
没有代码不知道你用的是否是IOCP,IOCP核心代码其实没有多少
我找到原因了。 原来是关闭的时候没有考虑到有数据在发送的情况下。 麻烦各位前辈了! 我延迟1秒再关闭就OK了。
Eleven 2015-02-05
  • 打赏
  • 举报
回复
你Debug一下你的接收端,可能一次将2个包都收了~
ArthurKingYs 2015-02-05
  • 打赏
  • 举报
回复
楼主能一个服务器连接多个客户端么 我是来求程序的
worldy 2015-02-05
  • 打赏
  • 举报
回复
引用 15 楼 y66721986 的回复:
我用普通的select模型写了一个,最后2个包他显示是一次发送出去的。一次发送了200字节。但是用完成端口他就分2次收到 1次189 一次11字节 我不知道怎么解了 [quote=引用 14 楼 worldy 的回复:] 没有代码不知道你用的是否是IOCP,IOCP核心代码其实没有多少
我找到原因了。 原来是关闭的时候没有考虑到有数据在发送的情况下。 麻烦各位前辈了! 我延迟1秒再关闭就OK了。[/quote] select模型就不是IOCP,必须创建IO完成端口,创建完成端口例程,创建工作线程,然后对收发进行投递,一般socket不需要关闭,可以回收使用....LZ还是先研究一下什么是IOCP模式,可能会更有帮助
y66721986 2015-02-05
  • 打赏
  • 举报
回复
我已经找到问题了,虽然没解决,但这贴子我结了吧。 问题查明是closesocket的时候最后一个包还没有发出就直接关闭了。 这个问题我也不知道怎么解决,我另外发一个帖子吧。
y66721986 2015-02-05
  • 打赏
  • 举报
回复
引用 19 楼 VisualEleven 的回复:
你Debug一下你的接收端,可能一次将2个包都收了~
谢谢版主大人,我已经找到问题了。是发最后一个包的时候没有发完就closesocket了。 然后我就想用优雅地关闭socket 百度找到如下代码,但是始终达不到效果。
linger lg = {1, 10}; // 表示延迟打开,延迟10秒  
setsockopt(m_socket, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(linger));  
shutdown(m_socket, SD_BOTH); // 也可以设置第二个参数为SD_SEND或SD_RECEIVE  
closesocket(m_socket);
y66721986 2015-02-05
  • 打赏
  • 举报
回复
引用 18 楼 u011001084 的回复:
楼主能一个服务器连接多个客户端么 我是来求程序的
http://blog.csdn.net/piggyxp/article/details/6922277
y66721986 2015-02-05
  • 打赏
  • 举报
回复
引用 14 楼 worldy 的回复:
没有代码不知道你用的是否是IOCP,IOCP核心代码其实没有多少
但是现在问题又来了,延迟1秒时间导致效率损失太多,而我用如下代码想优雅地关闭socket又发现在这些代码竟然失效了……完全无效……
linger lg = {1, 10}; // 表示延迟打开,延迟10秒  
setsockopt(m_socket, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(linger));  
shutdown(m_socket, SD_BOTH); // 也可以设置第二个参数为SD_SEND或SD_RECEIVE  
closesocket(m_socket);  
所以想问一下前辈我现在应该怎么办。
worldy 2015-02-04
  • 打赏
  • 举报
回复
没有代码不知道你用的是否是IOCP,IOCP核心代码其实没有多少
y66721986 2015-02-04
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
把你的大妈发出来看看呗
前辈你好,我是做socks5的代理服务器,每一个实例里都包含了3个socket 一个对方请求的socket,一个用于转发请求内容的的tcp socket,一个用于转发请求内容的udp socket 一般只会用到其中2个 一个请求的socket 、 tcp或udp 2者选1,我把他们都绑定在了完成端口上。 我上面的图片是显示了通过socks5验证后自己的tcp按照对方的请求连接上了某网站获取了数据并马上转发给客户端。但不知道哪里出了错。最后11字节的数据没有发送完成。
y66721986 2015-02-04
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
把你的大妈发出来看看呗
不好意思代码太长不知道怎么发。
y66721986 2015-02-04
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545

学会使用抓包软件比如wireshark,是调试TCP通讯程序的基本功。

谢谢赵老师的提醒,我下了wireshark并分析了一下,我把成功跟失败的包都集合在一起了,能麻烦您看一下吗?我看到是没收到ACK确认 上百的包是错的,没有收到最后的11个字节数据。下面的是我下延迟了1秒钟才发送的,11个字节是发送成功的
现在就是最后11个字节收不到。我在完成端口里是收到了通知 11个字节发送成功的。
我上图
赵4老师 2015-01-30
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545 学会使用抓包软件比如wireshark,是调试TCP通讯程序的基本功。
翅膀又硬了 2015-01-30
  • 打赏
  • 举报
回复
是不是粘包了,两包一起收到了?
brk1985 2015-01-27
  • 打赏
  • 举报
回复
思路理理。。。 发送端、转发服务器、接收端 这3个吧?发送端连续发2条数据到转发服务器,转发服务器就转发到接收端?
worldy 2015-01-27
  • 打赏
  • 举报
回复
引用 楼主 y66721986 的回复:
小弟最近接受IOCP,琢磨了好些天了眼看快要完成了却出现了这种问题。我是写了一个转发的服务器,收到客户端连续发来的2个数据时进行转发,我调试出WSASend时的时间,发现是同一毫秒,发送以后收到的通知信息是2个数据都发送成功。但是客户端只能收到第一个数据。 然后我试着发送第二个数据的时候延迟了500毫秒的时间,结果客户端就能收到了。这个问题真诡异,难道每次转发都得延迟500毫秒吗?那这IOCP的速度不敢想象啊。还是我哪里没理解对呢。请各们前辈帮我一下,小弟不感激不尽!
LZ肯定是代码哪里有问题,IOCP可以说是服务器端最好的模型
worldy 2015-01-27
  • 打赏
  • 举报
回复
把你的大妈发出来看看呗
y66721986 2015-01-27
  • 打赏
  • 举报
回复
引用 3 楼 brk1985 的回复:
思路理理。。。 发送端、转发服务器、接收端 这3个吧?发送端连续发2条数据到转发服务器,转发服务器就转发到接收端?
是socks5代理转发! 不知道问题出在哪里。如果您可以帮忙远程看看,有偿
y66721986 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
[quote=引用 楼主 y66721986 的回复:] 小弟最近接受IOCP,琢磨了好些天了眼看快要完成了却出现了这种问题。我是写了一个转发的服务器,收到客户端连续发来的2个数据时进行转发,我调试出WSASend时的时间,发现是同一毫秒,发送以后收到的通知信息是2个数据都发送成功。但是客户端只能收到第一个数据。 然后我试着发送第二个数据的时候延迟了500毫秒的时间,结果客户端就能收到了。这个问题真诡异,难道每次转发都得延迟500毫秒吗?那这IOCP的速度不敢想象啊。还是我哪里没理解对呢。请各们前辈帮我一下,小弟不感激不尽!
LZ肯定是代码哪里有问题,IOCP可以说是服务器端最好的模型[/quote] 前辈能否帮一下忙看一下问题到底出在哪里呢?有偿可以吗?我的QQ357491546 求前辈指点一下
加载更多回复(3)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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