使用ACCEPT获得IP地址出错 本帖最后由 VisualEleven 于 2010-11-16 11:49:50 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))//这样调用就会出错if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)//这样调用就没有问题,我很是郁闷,似乎成与不成之间就是在参数上面但是我后来作为补救调用:getpeername却没问题 你应该用WSAGetLastError来查看下错误返回值是多少 当然是参数问题,自己不会看MSDN,人家说的很清楚accept的pthis->m_clientAddrLen这个参数的值要传递进去的是[in,out]的就是传进传出的参数要不你就干脆弄成NULL否则参数必须传递进去也就是先pthis->m_clientAddrLen = sizeof(SOCKADDR _IN);再:if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET)) 本帖最后由 VisualEleven 于 2010-11-10 11:05:46 编辑 自己看WSAGetLastError函数的返回值 WSAGetLastError第一次为0但是已经出错,无法绑定IO端口第二次10038,因该是第一次出错导致sock被关闭了 10038: An operation was attempted on something that is not a socket. 问题在于if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET)) { AfxMessageBox("获取远程连接出错,正在重新开始服务`````"); }int i=WSAGetLastError();AfxMessageBox("error"); pthis->OnAccept(pthis->m_aSocket); // 调用 OnAccept()通知应用程序有新客户端连接 if(pthis->m_aSocket==0) { i=WSAGetLastError(); AfxMessageBox("error"); }第一次返回0的时候已经出错 了~ 额不大喜欢看网上贴的代码,太麻烦。pthis->m_aSocket = accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET)你敢不敢不用pthis->m_aSocket这个句柄去接收新连接的句柄你这个pthis->m_aSocket句柄已经在 accept()第一个参数里出现过了我没猜错pthis->m_aSocket应该是有值的。。你然后accept之后,把这个值改变了咱这样行不SOCKET LSocket;LSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen))if (( LSocket == INVALID_SOCKET)){ AfxMessageBox("获取远程连接出错,正在重新开始服务`````"); } Sorry看错了。你的两个socket不同的。你的socket绑定失败? 根据网上的说法,貌似IOCP模型下accept不能使用···我砍好像没有用的accept的时候可以成功获得客户端的IP 地址,但是accept返回的是0·····第一次,第二次都是返回0 下面这行的第一个参数错了,应该是accept(pthis->m_ListenSocket, ...........if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET)) 如果没有pthis->m_ListenSocket,就添加这个成员,并在上面bind,listen 根本不是的··if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)一点问题都没有~~~~~ 第一个是if ((pthis->m_aSocket=(...)== INVALID_SOCKET))//意思是m_aSocket赋值为后面判断式的值?if(( pthis->m_aSocket=(...))== INVALID_SOCKET)//意思是m_aSocket赋值后的布尔值来判断等于INVALID_SOCKET不?但愿没看错~意思有点费解哦 以前编程accept都在主线程里,有连接就开启新线程。但这不是主要原因。 已经自己解决了,是因为if语句使用不当if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))改为pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen);就ok了~~~~~结贴 MFC对U盘进行操作 vc实现搜索计算机中的doc文档 关于怎么判断鼠标在哪个对话框的问题,我创建了一组无模态对话框,问题如下 用无文档视图结构打印预览时,多页时翻页为何"前一页"按钮永远是灰的?(进来有详细说明) 完成端口模型中,如果判断一个clientsocket是否关闭了? 去浩方玩CS总不让进(要钱),为什么我们不自已做一个,OPENSOURCE,FREE?! EnterCriticalSection()和LeaveCriticalSection()的用法? 小弟不才!第一atl程序都把我给吓住了!大家帮一下忙了! 知道怎样把NTFS文件系统转成FAT32文件系统? 小问题!!但急!!!!!! 跪求 灰鸽子源代码VC 的 或是 有过研究的朋友也可以一起交流下经验 如何得到第一块硬盘的最后分区号及盘符?
//这样调用就会出错
if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)
//这样调用就没有问题,我很是郁闷,似乎成与不成之间就是在参数上面
但是我后来作为补救调用:
getpeername却没问题
accept的pthis->m_clientAddrLen这个参数的值要传递进去的
是[in,out]的就是传进传出的参数
要不你就干脆弄成NULL
否则参数必须传递进去
也就是先pthis->m_clientAddrLen = sizeof(SOCKADDR _IN);
再:
if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
第二次10038,因该是第一次出错导致sock被关闭了
{
AfxMessageBox("获取远程连接出错,正在重新开始服务`````");
}
int i=WSAGetLastError();
AfxMessageBox("error"); pthis->OnAccept(pthis->m_aSocket); // 调用 OnAccept()通知应用程序有新客户端连接
if(pthis->m_aSocket==0)
{ i=WSAGetLastError();
AfxMessageBox("error");
}
第一次返回0的时候已经出错 了~
pthis->m_aSocket = accept(
pthis->m_sSocket,
(SOCKADDR *)&pthis->m_clientAddr,
&(pthis->m_clientAddrLen))
== INVALID_SOCKET)
你敢不敢不用pthis->m_aSocket这个句柄去接收新连接的句柄
你这个pthis->m_aSocket句柄已经在 accept()第一个参数里出现过了我没猜错pthis->m_aSocket应该是有值的。。你然后accept之后,把这个值改变了咱这样行不
SOCKET LSocket;
LSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen))
if (( LSocket == INVALID_SOCKET))
{
AfxMessageBox("获取远程连接出错,正在重新开始服务`````");
}
你的socket绑定失败?
accept的时候可以成功获得客户端的IP 地址,但是accept返回的是0·····第一次,第二次都是返回0
if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)
一点问题都没有~~~~~
if ((pthis->m_aSocket=(...)== INVALID_SOCKET))
//意思是m_aSocket赋值为后面判断式的值?
if(( pthis->m_aSocket=(...))== INVALID_SOCKET)
//意思是m_aSocket赋值后的布尔值来判断等于INVALID_SOCKET不?
但愿没看错~意思有点费解哦
if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
改为
pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen);
就ok了~~~~~结贴