您的位置:程序门 -> delphi -> 网络通信/分布式开发



winsock 获取等待队列的信息


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


winsock 获取等待队列的信息
发表于:2008-01-14 14:31:08 楼主
用winsock开发网络程序时需要获取当前已向服务端发出连接connect但尚未被accept的客户端的信息(如ip,端口等).听所这些等待接受的请求是放在一个等待队列中的,
不过查了一下相关的资料,没有发现这种操作等待队列的函数,在此向各位高人请教.
发表于:2008-01-14 14:57:271楼 得分:0
这个列表不提供用户接口,如果想要根据需要进行选择性地accept,建议使用wsaaccept.
发表于:2008-01-14 15:54:262楼 得分:0
我的意思是在未accept前就能够看到那些正在请求中的客户端,然后再由用户选择是否接受
发表于:2008-01-14 16:15:353楼 得分:0
参考csdn关于wsaaccept的函数说明。
发表于:2008-01-14 16:51:144楼 得分:0
  socket   wsaapi   wsaaccept   (   socket   s,   struct

                    sockaddr   far   *   addr,   int   far   *   addrlen,

                    lpconditionproc   lpfncondition,   dword

                    dwcallbackdata   );

难道等待队列中的所有地址都在addr里面吗?
假如设置listen(s,10),那么如何取等待队列中的10个待接受的地址,请明示
发表于:2008-01-14 17:41:205楼 得分:0
楼主应该重点看wsaaccept最后两个参数.
发表于:2008-01-15 12:09:196楼 得分:0
僵哥能不能给一个wsaaccept()包含非空lpfncondition参数的具体例子,因为查阅了相关资料关于wsaaccept()的使用,lpfncondition和dwcallbackdata参数都为空.lpfncondition是一个函数指针,那么这个函数的声明(参数列表,返回值等)是什么样子的,调试成功后马上给分.
发表于:2008-01-18 14:04:077楼 得分:0
the   conditionfunc   is   a   placeholder   for   the   application-specified   callback   function.   the   actual   condition   function   must   reside   in   a   dll   or   application   module.   it   is   exported   in   the   module   definition   file.

int   callback   conditionfunc(
    in   lpwsabuf   lpcallerid,
    in   lpwsabuf   lpcallerdata,
    in   out   lpqos   lpsqos,
    in   out   lpqos   lpgqos,
    in   lpwsabuf   lpcalleeid,
    out   lpwsabuf   lpcalleedata,
    out   group   far   *g,
    in   dword_ptr   dwcallbackdata
);


+socket   winapi   wsaaccept(   socket   s,   struct   ws_sockaddr   *addr,   lpint   addrlen,
+                               lpconditionproc   lpfncondition,   dword   dwcallbackdata)
+{
+
+               int   ret   =   0,   size   =   0;
+               wsabuf   callerid,   callerdata,   calleeid,   calleedata;
+               /*                 qos   sqos,   gqos;   */
+               group   g;
+               socket   cs;
+               sockaddr   s_addr,   d_addr;
+
+               trace("socket     %ui,   sockaddr   %p,   addrlen   %p,   fncondition   %p,   dwcallbackd   ata   %ld\n",
+                               s,   addr,   addrlen,   lpfncondition,   dwcallbackdata);
+
+              
+               size   =   sizeof(s_addr);
+               cs   =   ws_accept(s,   &s_addr,   &size);
+              
+               if   (cs   ==   socket_error)   return   socket_error;
+
+               callerid.buf   =   (char   *)&s_addr;
+               callerid.len   =   sizeof(s_addr);    
+
+               callerdata.buf   =   null;
+               callerdata.len   =   (ulong)null;      
+
+               ws_getsockname(cs,   &d_addr,   &size);
+
+               calleeid.buf   =   (char   *)&d_addr;
+               calleeid.len   =   sizeof(d_addr);    
+
+              
+               ret   =   (*lpfncondition)(&callerid,   &callerdata,   null,   null,
+                                               &calleeid,   &calleedata,   &g,   dwcallbackdata);  
+
+               switch   (ret)
+               {
+                               case   cf_accept:
+                                               if   (addr   &&   addrlen)
+                                                               addr   =   memcpy(addr,   &s_addr,   (*addrlen   >   size)   ?     size   :   *addrlen   );
+                                               return   cs;
+                               case   cf_defer:
+                                               setlasterror(wsatry_again);
+                                               return   socket_error;
+                               case   cf_reject:
+                                               ws_closesocket(cs);
+                                               setlasterror(wsaeconnrefused);
+                                               return   socket_error;
+                               default:
+                                               fixme("unknown   return   type   from   condition   function\n");
+                                               setlasterror(wsaenotsock);
+                                               return   socket_error;
+                               }
+
+               setlasterror(wsaenotsock);
+               return   socket_error;


快速检索

最新资讯
热门点击