一个关于CSocket的棘手问题.

小元宝 2006-08-15 03:39:50
我在CSocket 多线程来发送文件列表,运行一段时间之后,一个客户端给另外一个可端发送一个命令时
,对方无法接受, Send 函数也被夯住, 不知道哪位大虾遇到过这样类似的问题,谢谢!
...全文
242 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小元宝 2006-08-16
  • 打赏
  • 举报
回复
我的问题已经解掉.
小元宝 2006-08-15
  • 打赏
  • 举报
回复
1.CSocket是非线程安全的
它应该指不要在多个线程中用同一个Csocket 对象吧,我是一个线程有唯一的Csokcet对象,不会有这样的问题。

2.你的线程间的同步?
同一个线程之间是同步的,而且并不会出现一个套截字在接受数据时,还发送数据的情况。

上面的问题是, 在CAsyncSocket::Send(lpBuf, nBufLen, nFlags)) 遇到WSAEWOULDBLOCK 事件,但是当下次可WRITE时,再次发送后,结果还是 WSAEWOULDBLOCK, 这样就形成一个死循环。
不知道,什么原因啊!!!!

if (!PumpMessages(FD_WRITE))
return SOCKET_ERROR;
DentistryDoctor 2006-08-15
  • 打赏
  • 举报
回复
1.CSocket是非线程安全的
2.你的线程间的同步?
snowbirdfly 2006-08-15
  • 打赏
  • 举报
回复
呵呵~
我也是基本上是采用楼上的方法~~~
毕竟MFC在某些封装不是太完美~~
但是这样做,难度也增加,毕竟要对于Winsock要比较熟悉~~~
Elysium 2006-08-15
  • 打赏
  • 举报
回复
我用SOCKET以及相关API,CSocket从Win16位脱胎而来,对于多线程处理略有不足,可以自己继承一个类编写控制函数
小元宝 2006-08-15
  • 打赏
  • 举报
回复
大家在写网络程序是很多人在使用MFC的CSocket,我觉得它并不好用,而且效率很低,还问题多多.
不知大家在开发的过程中自己建立Sokcet IO模型, 这样控制起来比较简单吧.
小元宝 2006-08-15
  • 打赏
  • 举报
回复
在一个客户端给另一个客户端发送数据的过程中,每次的数据包大小,都不一定相同,最大的有1百多K的buffer, 在循环发送多次后,某一次发送一个20个字节的数据,它被死锁在CSocket的SendChunk中的在PumpMessage中, 不知是何原因,难道是套接字的系统buffer已经满了??


int CSocket::SendChunk(const void* lpBuf, int nBufLen, int nFlags)
{
int nResult;
while ((nResult = CAsyncSocket::Send(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
if (!PumpMessages(FD_WRITE))
return SOCKET_ERROR;
}
else
return SOCKET_ERROR;
}
return nResult;
}
mynamelj 2006-08-15
  • 打赏
  • 举报
回复
一个客户端给另外一个可端发送一个命令时,对方无法接受

------------------------------

造成这种问题有太多的原因了,你还是把问题摸得更具体点,不然没办法帮你.

18,356

社区成员

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

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