acceptex如何得到客户端ip地址

tangrh 2004-01-29 01:23:17
我使用acceptex与完成端口结合重叠接受连接,这个函数可以同时接受连接和接收数据,我不想接收数据,该值设为0,完成端口得到完成通知后,如何获取客户端ip地址,我使用GetAcceptExSockaddrs,得到全0(acceptex使用的客户端套接字是从事先创建好的一个socket池中获取的)
...全文
380 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangrh 2004-01-30
  • 打赏
  • 举报
回复
感谢大家的捧场
tangrh 2004-01-30
  • 打赏
  • 举报
回复
我调试发现接收缓冲区里其实已经有了ip和端口的信息,GetAcceptExSockaddrs获取不出来,getpeername也不行,我干脆采用拷贝内存完成了,不知道怎么回事,我的操作系统是win2000 professional,难道GetAcceptExSockaddrs有问题么。
to freeshoot(巴蒂刘):那个接收长度(第4个参数)必须设为0,否则会接收数据,达不到我的要求。设为0(缓冲区长度并不是0,而是大于2倍sizeof(SOCKADDR_IN) + 16),然后那个缓冲区就可以得到ip和端口
ppchen 2004-01-29
  • 打赏
  • 举报
回复
lpfnGetAcceptExSockaddrs(
pContext->RecvBuffer,
0,
sizeof(struct sockaddr_in)+16,
sizeof(struct sockaddr_in)+16,
(struct sockaddr**)&plocal,
&len,
(struct sockaddr**) &premote,
&len
);

freeshoot 2004-01-29
  • 打赏
  • 举报
回复
更正一下我上面说的,buf长度为2倍sizeof(SOCKADDR_IN) + 16, 正好用来存储
LocalAddress和RemoteAddress。下面是我以前写的代码片断:

lpfnAcceptEx(listenobj->sock,
listenobj->sockClient,
acceptobj->buf,
acceptobj->buflen, // 等于 (sizeof(SOCKADDR_IN) + 16) * 2
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&bytes,
&acceptobj->ol);

注意第四行。
huangbeyond 2004-01-29
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/acceptex_2.asp

(详细的,见上面URL)

是第3参数
lpOutputBuffer
[in] Pointer to a buffer that receives the first block of data sent on a new connection, the local address of the server, and the remote address of the client. The receive data is written to the first part of the buffer starting at offset zero, while the addresses are written to the latter part of the buffer. This parameter must be specified.
tangrh 2004-01-29
  • 打赏
  • 举报
回复
to freeshoot(巴蒂刘) :
你指的是acceptex的第4个参数?
freeshoot 2004-01-29
  • 打赏
  • 举报
回复
在acceptex时,传递一个容纳客户机套接字地址结构大小的buf.
长度为sizeof(SOCKADDR_IN)+16。这样可不接受额外数据。
结构层次及相互联系 (1)、工作线程:响应连接的IO投递返回并负责投递读请求,并将IO返回结果投递给处理线程,可设定参数决定工作线程数量; (2)、处理线程:处理线程调用回调函数将信息传递给应用层或协议栈,可设定参数决定工作处理数量; (3)、看守线程:响应Accept事件调用AcceptEx,检测连接和心跳超时 ,将信息投递给工作线程,模块仅有一个看守线程。 1. 技术要求 (1)、线程同步:Lock指令、临界段; (2)、主要Socket API:WSASend、WSARecv、AcceptEx、DisconnectEx; (3)、内存管理:连接池(句柄重用)、内存池; (4)、数据0拷贝:通过内置处理线程,上层应用可以避免自建线程池及复制数据的过程。同时提供GBuf内存分配功能,应用层获得分配地址及填充数据之后亦可直接投递给内核/驱动层; (5)、数据顺序同步:同一个连接同时只有一个处理线程响应其IO事件; (6)、IO请求投递:单投递读、多投递写; (7)、0缓冲读投递:可条件编译实现,以适用大规模连接要求。 (8)、超时机制:可设置空连接(连接不发送数据)超时时间以防止DOS攻击,也可设置心跳超时时间防止网络故障导致的现有连接成为虚连接避免耗尽系统资源。 (9)、接口技术:API、回调函数、客户句柄(客户连接句柄)。 (10)、主、被动发送:不使用HASH、MAP及LIST技术,即可提供安全可靠高效的客户连接句柄,以实现服务器端主被动发送数据功能; (11)、PerHandleData的回收不以IO投递的计数器或链表来做依据但仍能安全回收,同时尽量避免在高频的读写操作时做其他无关的操作以提高读写效率。 (12)、处理线程和工作线程有着良好分工界限,繁重的工作交给处理线程完成,工作线程工作量最大限度的减少,仅响应投递返回及读投递的操作; (13)、支持AWE,模块自动识别AWE是否开启(需手动开启),“否”则使用虚拟内存机制。 2. 功能要求 (1)、多IP多端口监听,每个监听可设置不同的回调函数,以高效的区别处理数据 (2)、可设置每秒最大的连接并发量和空连接(连接不发数据)超时时间以防止DOS攻击造成的服务瘫痪、具有心跳处理(防网络异常造成的虚连接)功能 (3)、不加协议的透明传输,可适用广泛的网络通讯环境 (4)、可现实主、被动发送数据,但不会因兼顾主动发送而额外增加降低效率的工作 (5)、内置处理线程,上层应用可不必自建线程池处理数据,所有IO事件按顺序调用回调函数并可以在回调函数内直接处理数据,不必担心多线程造成的接收数据乱序的问题。 (6)、高效率的数据对应关联机制,在初次连接并根据登录数据设置每个连接对应的宿主(Owner)之后,再接收的数据即可立即获得该连接对应的宿主,而不必再做额外的查询工作,并且模块内部采用的是指针关联方式,对于长连接、主动发送的服务器系统而言是高效率的。 (7)、可兼容IPv6 3. 注意事项 因硬件环境和应用环境不同,不合理的配置会出现效率及性能上的问题,因此以下情况出现时,请务必与作者联系以确保获得更好的参数配置: (1)、连接量超过1000个的。超过的应结合具体硬件配置和网络带宽等因素综合设定运行参数。 (2)、带宽使用率超过20%的。工作线程和处理线程数量的设置也是综合考虑数据吞吐量和数据处理负载的因素来设置的,过多的线程会在调度上浪费时间,同时也应该综合考虑线程优先级别来设置工作线程和处理线程数量,两者的设置也不一定能相等。 (3)、服务器端有主动发送需求的、短连接(含网络故障造成的连接断开)出现频率高的。 压力测试工具介绍: 一、 使用G-TcpClient模块 二、 可以设定间隔时间发起大规模长、短连接 三、 可以发起密集数据包,包括即时和定时发送,1M的光纤带宽最大可以达到100K/S(单向)以上,100M本地网最大可以达到10M/S(单向)以上 四、 数据发送仅由一个独立线程但当,每点击一次Connect就创建一个线程根据当前参数发起连接。 五、 测试前提:服务器接收客户端数据后立即原样返回给客户端

18,356

社区成员

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

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