我的服务器是完成端口模型的,用WSAAccept等待连接。客户端用 WSAConnect 连接
,为了能确定一些链接的信息,我想是用int  WSAConnect(
  SOCKET s,                          
  const struct sockaddr FAR *name,  
  int namelen,                       
  LPWSABUF lpCallerData,             
  LPWSABUF lpCalleeData,             
  LPQOS lpSQOS,                      
  LPQOS lpGQOS                       
);      的  lpCallerData参数传数据据给 服务器 端的回调函数ConditionFunc 吧。但是我能连接成功,也能连接后通信,就是这个连接时的参数无法传递。我断点调试回调函数什么也没接受到。一下是部分源码://服务器端口:
 if ((Accept = WSAAccept(Listen, NULL, NULL, ConditionFunc, 0)) == SOCKET_ERROR)
   {  ...}
 else{...}
客户端:
...
WSABUF Wsabuf_Send;
WSABUF Wsabuf_Recv;
...
   Wsabuf_Send.buf="SOCK_STREAM";
   Wsabuf_Send.len=12;
   Wsabuf_Recv.buf="";
   Wsabuf_Recv.len=100;
...
if(SOCKET_ERROR==WSAConnect(Socket_Client,(SOCKADDR*)&InternetAddr,sizeof(SOCKADDR),&Wsabuf_Send,&Wsabuf_Recv,NULL,NULL))
{...}
else  {...}

解决方案 »

  1.   

    我就是 baidu google 搞不定,才来这里问的呀!
      

  2.   

    Wsabuf_Send.buf="SOCK_STREAM";//实样并未实际分配内存
    Wsabuf_Send.len=12;char sendBuff[12]="SOCK_STREAM";Wsabuf_Send.buf=sendBuff;
    Wsabuf_Send.len=12;
      

  3.   

    怎么会没有分配内存呢?我调试客户端是看了的,我的Wsabuf_Send.buf 和,Wsabuf_Recv 都是有值的。顺便再问一句,WSAAccept的回调函数的参数有那么多的指针,我想问的是,这些指针指向的内存是怎么赋值的呢?要是本地传的参数,还可以说是传地址,可是远程的给函数赋值,不可能说是传地址吧??
      

  4.   

    WSAAccept的那个lpfnCondition是怎么初始化的?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.
      

  5.   

    不使用QOS使用WSAAccept/WSAConnect确实是没有必要。使用的是完成端口不如使用AcceptEx,如果客户端也基于重叠IO的话,换成ConnectEx不是更好?
      

  6.   

    哦,WSAAccept 的 lpfnCondition 就是照着 msdn上的定义拷贝下来的,这个函数是肯定没问题的,声明的全局函数,而且我又发现了,函数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 dwCallbackData
    ); 的lpCallerId,这个参数是传递成功了的,我刚才没有发现是因为 要强制类新转换成 SOCKADDR_IN 才看得到,而且 lpCalleeId 也是有只的,就是lpCallerData 没有值,是空的。我不明白,为什lpCallerData不能传递成功,而lpCallerId 却可以传递成功了呢?????
      

  7.   

    我要用WSAAccept 原因是,我要判断连接的信息,而这个信息只能有WSAconnect 来发送,而且也
    正好可以在WSAAccept的回调函数中来判断连接的信息,(要是非法的话,我可以拒绝),所以
    我不能用AcceptEx....各位 难道你们没有用过 WSAAccept 的 回调函数吗?????
      

  8.   

    The ConditionFunc is a placeholder for the application-supplied callback function. The actual condition function must reside in a DLL or application module. It is exported in the module definition file. 既然msdn上这么说,于是我弄了个DLL_declspec(dllexport) 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 dwCallbackData
    )   当然,我也运行起了,但是lpCAllerData依然没有值,一旦引用了lpCallerId 的话,程序就会报错,是非法访问的错,显然,这是因为这个指针是形参里声明的,没有指向一个内存地址,但是,要是本地传地址,当然好说 但这是一个接受网路WSAconnect的函数,我怎样才能让他有地方可以指向了.....??????????????????????????
      

  9.   

    其实很简单,TCP等大多数协议都不支持这个功能,所以没有用!!!
    去看看windows网络编程就知道了
      

  10.   

    如果想知道是否支持对这个参数的支持就要用WSAEnumProtocols函数查看,不过你是要用TCP/IP,所以就一定没有用!
      

  11.   

    http://blog.csdn.net/wang921718/archive/2007/09/04/1772396.aspx看看这里我的BLOG,希望对你能有帮助!
      

  12.   

    From http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaconnect_2.asp:Note Connect data is supported only on ATM (RAWWAN) over a raw socket. TCP/IP in Windows does not support connect data.
      

  13.   

    http://msdn.microsoft.com/en-us/library/ms741559(VS.85).aspx
    在WSAConnect Function的文档中有
    Note Connect data is supported only on ATM (RAWWAN) over a raw socket. TCP/IP in Windows does not support connect data.