郁闷,通过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);

郁闷了很久了.
大家帮帮忙,好象没什么错啊!
谢谢!
...全文
358 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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啊.晕了.

18,363

社区成员

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

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