CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

WinSock错误,望各位指教

楼主ccnuxjg()2001-09-25 17:03:15 在 VC/MFC / 基础类 提问

我有一个程序在调试状态下会有问题,但在发行版状态下,程序可以正常运行  
  程序代码如下:  
  UINT   MyAcceptThread(LPVOID   lpParam)  
  {  
  CSocket   sockRecv;  
   
  sockSrvr.Accept(sockRecv);//sockSrvr定义为全局变量  
   
  char   buf[]="Just   A   Test";  
  sockRecv.Send(buf,sizeof(buf));  
  sockRecv.Close();  
  AfxMessageBox("The   File   Has   Sucessfully   Translate!");  
  return   1;  
  }  
   
  void   CTranfileDlg::OnSend()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  SOCKADDR_IPX   sa_ipx;  
  sa_ipx.sa_family=AF_IPX;  
   
  WSADATA   wsaData;  
  ::WSAStartup(MAKEWORD(1,1),&wsaData);  
  sockSrvr.Create(0x1234);  
   
  sockSrvr.Listen();  
  AfxBeginThread(MyAcceptThread,0);  
  }  
  此程序在调试模式下,系统会提示“degbug   assertion   failed"文件sockcore.cpp第850行出错,调试出错在  
  sockSrvr.Accept(sockRecv);//sockSrvr定义为全局变量  
  这一行  
  但是在发行版则会跳过错误,但接受方接受到的信息不正确。各位高手帮忙看看是什么原因?  
  不胜感激。 问题点数:40、回复次数:13Top

1 楼fyfyfyfy()回复于 2001-09-25 17:23:06 得分 2

你先单步跟踪一下程序再说!Top

2 楼nichang(nichang)回复于 2001-09-25 17:24:30 得分 2

在listen和accept执行时检查一下返回值,是否执行成功。Top

3 楼unix_xiang(红旗下的蛋)回复于 2001-09-25 17:57:15 得分 2

你没有初始化SOCKET,好像就这样去阻塞不太好Top

4 楼baili()回复于 2001-09-25 18:06:40 得分 20

关键问题是线程,你可以试试在一个线程里面listen()和Accept(),这样应该就没有什么问题了,我的经验是一个socket的打开、监听、接受、发送,直到关闭,都最好在同一个线程中进行,否则肯定有问题,不信的话你试试。  
  你如果跟踪进去看(f10),会发现出错的是在mfc的原码中。  
  应该是这样的。Top

5 楼steventt(steven)回复于 2001-09-25 18:08:10 得分 2

最好sockRecv初始化一下!Top

6 楼xzou(亡狼补齿)回复于 2001-09-25 18:11:46 得分 2

baili(心烦!一下子多了几个情敌!)说的有理,把你的全局sockSrvr用局部的代替,操作在一个线程里完成就没有问题了Top

7 楼ccnuxjg()回复于 2001-09-26 08:31:20 得分 0

多谢各位的指教,现在明白了一些,请继续讨论  
  to   fyfyfyfy:   调试时错误就是发生在sockSrvr.Accept(sockRecv);  
  to   nichang:   listen()执行成功,但accept()一条试系统会提示“degbug   assertion   failed"文件sockcore.cpp第850行出错,调试出错在  
   
  to   baili:你说的有道理Top

8 楼ccnuxjg()回复于 2001-09-26 08:35:43 得分 0

各位有好的方法请提出来,下午揭贴Top

9 楼baili()回复于 2001-09-26 09:01:21 得分 0

昨天走的太急,现在来补充两句  
  你如果跟踪进去,会发现出错的地方是和线程有关的,所以最好不要在不同的线程对同一个socket进行操作,而且我觉得你的那个线程没有说明作用,把接收连接的操作放到监听线程中就可以了Top

10 楼ccnuxjg()回复于 2001-09-26 09:47:08 得分 0

谢谢各位的帮助,我将程序如baili所说的改了一下,将listen和accept放到同一个线程之后问题解决了,代码如下(共各位研究):  
  UINT   MyAcceptThread(LPVOID   lpParam)  
  {  
  CSocket   sockSrvr;  
  SOCKADDR_IPX   sa_ipx;  
  sa_ipx.sa_family=AF_IPX;  
   
  WSADATA   wsaData;  
  ::WSAStartup(MAKEWORD(1,1),&wsaData);  
  sockSrvr.Create(0x1234);  
   
  sockSrvr.Listen();  
  CSocket   sockRecv;  
   
  sockSrvr.Accept(sockRecv);  
   
  char   buf[]="Just   A   Test";  
  sockRecv.Send(buf,sizeof(buf));  
  sockRecv.Close();  
  sockSrvr.Close();  
  AfxMessageBox("The   File   Has   Sucessfully   Translate!");  
  return   1;  
  }  
   
  void   CTranfileDlg::OnSend()   //响应按钮"send"的事件  
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
   
  AfxBeginThread(MyAcceptThread,0);  
  }  
   
  但是又有一个新的问题,我点击多次发送"send"按钮执行发送,但接受方只接受到一次信息,  
  问题出在那?请帮帮我.下午5点给分Top

11 楼ccnuxjg()回复于 2001-09-26 09:53:33 得分 0

补充几句,有必要用到套接字的I/O模型吗?  
  我以为要为函数select()设定一个时间限制,判断在套接子上面有消息之后,再调用accept,接受和发送信息。还是需要用到其他的几个函数好些.如:事件选择、异步选择、重叠模型设定?  
  问题多多,真不好意思。。。  
  (分数不够可以再加)Top

12 楼Ashura(阿修罗)回复于 2001-09-26 10:02:00 得分 10

发送后缓存会清空的,实际上你什么也没发。  
  你应该重新填充缓存区。  
  如果你的程序要求不高,直接使用消息模式  
  就可以了,注意OnConnect事件是无效的。  
  I/O模型其实效果都差不多,用那个都无所谓,  
  我目前做的用的是重叠模式——因为要流控的关系。  
  Top

13 楼ccnuxjg()回复于 2001-09-26 10:03:27 得分 0

又发现了一个新问题,经过调试,如果只执行一次响应函数OnSend(),那么程序线程在Accept处会阻塞,但是如果再执行一次,程序就会执行Accept()下的语句。这是什么回事Top

相关问题

  • 关于全选的错误,希望各位帮忙!!!!
  • 恼人的错误,望各位大侠们进来看看
  • winsock连接错误
  • Winsock程序有错误,望高手解决。(在线等)
  • WINSOCK控件加载错误
  • sql语句错误,各位帮忙。
  • "类"错误!请各位大虾帮忙?
  • 各位港我看看这个错误??
  • 请各位帮忙看个错误
  • ____________“配置错误 ”请教各位!

关键词

  • sa
  • socksrvr
  • sockrecv
  • 调试
  • ipx
  • 程序
  • wsadata
  • accept
  • buf

得分解答快速导航

  • 帖主:ccnuxjg
  • fyfyfyfy
  • nichang
  • unix_xiang
  • baili
  • steventt
  • xzou
  • Ashura

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo