高分求教线程与Socket编程的问题!

sxbyl 2000-09-14 05:43:00
现在我在编一个数据传输的程序,用的是自己从CSocket派生来的类,在进行大型文件的发送时发生问题(几十兆)。我的Server端用的是事件驱动。
开始时,我直接用Send,返回WSAENOBUFS错误(为简单起见,我的buffer也开了几十兆)……,看来这种懒办法是不行了。
我又采用第二种方法,将这个大文件分为若干小块进行传输,由于我发现Server端不管buffer开多大,最大只能收到8760字节信息,所以我将这个大文件划为8760字节的小文件。这回成了,但是由于Send放在主线程中,所以Client端界面反映十分迟钝。因此我将Send部分(包括文件的分割)放在了一个线程中,然后由主线程调用此线程,
但当一个38076280字节的文件传送到26280字节时,发生错误,在sockcore.cpp的第850行中断,是CSocket::PumpMessages(UINT uStopFlag)中的
ASSERT(pState->m_hSocketWindow != NULL);
但当我直接调用该线程函数,不通过AfxBeginThread则一切正常。更奇怪的是,当我跟踪时,只要不是一直按着F5,程序也不会出错(出错后跟踪都是汇编,而这时又正常了,简直&^&%$^$!##@$)如果我在每个Send后天加一条Sleep(100),则可以多发一些内容再出错。我简直要疯了,现我以100分求解脱,求大虾帮忙……
...全文
234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
meifen 2001-07-13
  • 打赏
  • 举报
回复
4
sxbyl 2000-09-19
  • 打赏
  • 举报
回复
由于这两天工作太忙,所以先把这个问题搁下,分嘛……大家先分了好了。
kingwill 2000-09-15
  • 打赏
  • 举报
回复
哦?有点意思。揪其根本,是CSOCKET类的问题,建议你用CASYNCSOCKET。如果你非要用CSOCKET
记住,一定要控制阻塞,作好控制。比如,再你的多线程SOCKET编程(CSOCKET),一定少不了
CANCLEBLOCK()这个函数。最后你说的SLEEP(100)那个问题,我以前就碰上过:)还好。。。这也是阻塞问题。
其实,做通讯程序。只要保证连接成功。大多数问题是控制阻塞、重发控制问题。切记,切记
hardstar 2000-09-15
  • 打赏
  • 举报
回复
呵呵!是vc的bug.你要用sp3才行。
sxbyl 2000-09-15
  • 打赏
  • 举报
回复
唉!由于备份过程中Ctrl+Z多按了几下,这两天算是白忙了,真是气死我也……
不知那里有Sp3可下?懒得去找了,望见告。kingwill的话很有些道理,等我把程序重新建起来后试一下。想起来真是来气,真不知微软怎么搞的,撤销什么时候只能删除不能恢复了,岂有此理^@&$%
Sunlet 2000-09-14
  • 打赏
  • 举报
回复
CSocket不好用
sword_hero 2000-09-14
  • 打赏
  • 举报
回复
CSocket还是比较好用的,但CSocket类在线程序使用有些问题,如果你下载了VC SP3可能就没错了
坎坷的菜贩 2000-09-14
  • 打赏
  • 举报
回复
……有可能是server没有及时将client发送的数据全部读入的原因,从按F5断点运行以及添加Sleep延时的结果可以看出来。建议在发送接收过程中添加同步机制。

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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