WinSock错误,望各位指教
我有一个程序在调试状态下会有问题,但在发行版状态下,程序可以正常运行
程序代码如下:
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




