win32 TCP通信连续发送接收数据的问题

丁天庆 2018-04-25 12:01:32
我自己封装了一个mysocket类,里面用的是win32 的api进行socket,是TCP协议通信。这个类的作用就是作为一个客户端,连到指定的服务器上,然后跟服务器进行数据交互。按照TCP客户端的通信步骤,本来应该是send一次之后就要调用一次recv。我觉得这样很麻烦,就自己做了一个线程,线程里有一个死循环,一直接收数据。问题就是,我下一次send的时候需要先收到上一次的回应数据,然后根据解析的结果来确定要发什么消息。我尝试过在接收的子线程里用postThreadMessage 来实现,但是这个时候主线程会卡死在getmessage这里。请问一下有比较好的方法解决这个问题吗
...全文
1111 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34692210 2018-07-26
  • 打赏
  • 举报
回复
开个线程用WSAWaitForMultipleEvents模型,处理接收,接收处理完了选择send内容,过程清晰;在复杂点的IOCP了解下
haoshun123 2018-07-25
  • 打赏
  • 举报
回复
你问的问题分两个,回答不了太细:
1)关于Socket通讯,如果是windows环境下,可以看下重叠IO,网上有很多例子,基于事件通知的模式,可以解决你“什么时候该去接收”的问题。
2)关于线程同步,一般来说建议用带锁的同步队列+事件通知的形式,生产消费模式,没太大必要去用postThreadMessage之类的系统API来介入。
ALE_csdn 2018-07-23
  • 打赏
  • 举报
回复
当然如果链表里有同步就更好了.
ALE_csdn 2018-07-23
  • 打赏
  • 举报
回复
其实完全没必要那么复杂,在rev使用环行链表,strcut xx{int sign;char *data;}保存接收的数据,,每接收完一个包,sign置1表示该链表有数据,,

然后,send里循环判断是否有置sign为1,有拷贝该数据到缓存区,sign置0.

其实只要不是涉及到p2p的客户端,对硬件资源来说,没有半点的压力.
赵4老师 2018-04-26
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
shedawei 2018-04-26
  • 打赏
  • 举报
回复
WSAAsyncSelect用消息机制来处理收发
worldy 2018-04-26
  • 打赏
  • 举报
回复
你也不一定要使用postThreadMessage ,你可以使用一个全局缓冲区,两个线程共同使用,然后加同步
丁天庆 2018-04-25
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
如果不是UI线程, 应该使用 Event 或 Mutex 等同步信号量 如果是UI线程 使用PeekMessage 来替换GetMessage
这个不设计到UI,是我自己想做一个专门用于socket通讯的类, 这是在一个类里面。
zgl7903 2018-04-25
  • 打赏
  • 举报
回复
如果不是UI线程, 应该使用 Event 或 Mutex 等同步信号量 如果是UI线程 使用PeekMessage 来替换GetMessage
丁天庆 2018-04-25
  • 打赏
  • 举报
回复
引用 1 楼 smwhotjay 的回复:
这个就是涉及到设计模式什么的了,我是采用接口回调的方式,回调函数onRecv,或者提供一个方法GetMessage 遍历接收到的数据包
引用 1 楼 smwhotjay 的回复:
这个就是涉及到设计模式什么的了,我是采用接口回调的方式,回调函数onRecv,或者提供一个方法GetMessage 遍历接收到的数据包
大兄弟,能详细一点吗,这方面我不太熟啊,谢谢
smwhotjay 2018-04-25
  • 打赏
  • 举报
回复
这个就是涉及到设计模式什么的了,我是采用接口回调的方式,回调函数onRecv,或者提供一个方法GetMessage 遍历接收到的数据包

18,356

社区成员

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

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