郁闷,通过GetAcceptExSockaddrs怎么得不到IP,大家帮帮忙!解决问题,马上揭贴.

stonex_2000 2004-11-22 12:22:20
sockaddr_in * sa_server = NULL;
sa_server = new sockaddr_in;
memset( sa_server , 0, sizeof(sockaddr_in) );
int sa_server_len = sizeof(sockaddr_in);
sockaddr_in * sa_client = NULL;
sa_client = new sockaddr_in;
memset( sa_client , 0, sizeof(sockaddr_in) );
int sa_client_len = sizeof(sockaddr_in);

GetAcceptExSockaddrs( pNode->wsaBuffer.buf, //acceptex中设定的值
1500 - (sizeof(SOCKADDR_IN) + 16) * 2,//同上
sizeof(SOCKADDR_IN) + 16, //同上
sizeof(SOCKADDR_IN) + 16, //同上
(sockaddr **) &sa_server,
&sa_server_len,
(sockaddr **) &sa_client,
&sa_client_len);

CString strTemp;
strTemp = inet_ntoa(sa_client->sin_addr);

郁闷了很久了.
大家帮帮忙,好象没什么错啊!
谢谢!
...全文
400 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
elssann 2004-11-22
  • 打赏
  • 举报
回复

BOOL IOCOMP_ParseAddr(LPIO_CONTEXT lpIoContext)
/*++

Function Description:

此函数在IOCOMP_HandleAccept里调用,获取刚连接上来的客户端的IP和端口,
并保存在lpCommonObject的相应成员变量里,并判断本地端口是否是80
如果是80,返回TRUE,否则返回FALSE。

Arguments:

Return Value:

如果本地端口是80,返回TRUE,否则返回FALSE。

--*/
{
int nLen = 0;
LPSOCKADDR RemoteAddr;
LPSOCKADDR LocalAddr;
SOCKADDR_IN SockAddr;


nLen = sizeof(SOCKADDR);
lpGetAcceptExSockAddrs(
lpIoContext->szBuffer,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&LocalAddr,
&nLen,
&RemoteAddr,
&nLen
);
memcpy(&SockAddr, RemoteAddr, sizeof(struct sockaddr));
strncpy(lpIoContext->lpCommonObject->chClientAddr, inet_ntoa(SockAddr.sin_addr),15);
lpIoContext->lpCommonObject->nClientPort = ntohs(SockAddr.sin_port);


//
// 获取本地端口并判断是否是80
//

ZeroMemory(&SockAddr, sizeof(SOCKADDR_IN));
memcpy(&SockAddr, LocalAddr, sizeof(struct sockaddr));
if (ntohs(SockAddr.sin_port) == 80)
{
return TRUE;
}

return FALSE;
}// end of IOCOMP_ParseAddr
stonex_2000 2004-11-22
  • 打赏
  • 举报
回复
谢谢elssann(臭屁虫和他的开心果),
对不起啊!
你的代码没错.
我先前直接调用GetAcceptExSockaddrs这个函数的,不知道为什么就不行.
后来没使用mswsock.lib,而使用WSAIoctl函数取得指针后再调用就没问题了.

呵呵,想不通为什么会这样.

是不是我前面AcceptEx是使用WSAIoctl函数取得的函数指针,后面的GetAcceptExSockaddrs也必须这样做呢?
stonex_2000 2004-11-22
  • 打赏
  • 举报
回复
我这里运行出错:指令为0xccccccccc内存该内存不能为read.
我猜想应该是这两个指针的问题吧.
LPSOCKADDR RemoteAddr;
LPSOCKADDR LocalAddr;
这两个只是申明了指针,但没有分配内存给它.
stonex_2000 2004-11-22
  • 打赏
  • 举报
回复
我的AcceptEx是这样调用的.
BOOL bSuccess = lpAcceptEx(m_ListenSocket,
lpAcceptIoContext->sAimClient,
lpAcceptIoContext->szBuffer,
BUFFER_SIZE - (sizeof(SOCKADDR_IN) + 16) * 2,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&(lpAcceptIoContext->OverLapped));
elssann 2004-11-22
  • 打赏
  • 举报
回复
不知道你调用acceptex的时候是怎么调用的

Status = lpAcceptEx(
g_sListen[nIndex],
lpAcceptIoContext->sClient,
lpAcceptIoContext->wsaBuffer.buf,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&lpAcceptIoContext->ol
);

反正这个代码在我的程序里运行得非常正常/
elssann 2004-11-22
  • 打赏
  • 举报
回复
为什么不能运行?

这个代码在我的程序里运行得好好的。
stonex_2000 2004-11-22
  • 打赏
  • 举报
回复
谢谢elssann(臭屁虫和他的开心果),

我试了你的代码,不能运行的啊!
我添加了RemoteAddr = new sockaddr;
可以运行,但还是不能得到IP啊.晕了.
内容概要:本文介绍了COSO企业风险管理框架,阐述了企业风险管理的定义、目标、构成要素及其与内部控制的关系。文章指出,企业风险管理是一个由董事会、管理层及其他人员实施的,应用于战略制定并贯穿于企业之中的过程,旨在识别可能影响主体的潜在事项,管理风险以使其在该主体的风险容量之内,并为主体目标的实现提供合理保证。该框架强调了企业风险管理的八大构成要素:内部环境、目标设定、事项识别、风险评估、风险应对、控制活动、信息与沟通、监控。此外,文章还讨论了企业风险管理的局限性,如人为判断失误、成本与效益的权衡、管理层凌驾等。 适合人群:具备一定管理学基础知识,对风险管理有兴趣的学者、企业管理人员、内部审计师及外部审计师。 使用场景及目标:①帮助组织理解并应用企业风险管理框架,以提高组织的风险管理水平;②指导企业如何通过有效的风险管理来实现其战略、经营、报告和合规目标;③为企业提供一套标准化的风险管理语言,促进内外部沟通与合作。 阅读建议:读者应结合实际案例,深入理解每个构成要素的具体应用,同时关注企业风险管理的局限性,以全面把握企业风险管理的本质。此外,建议定期回顾和更新风险管理策略,以适应不断变化的内外部环境。

18,356

社区成员

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

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