我的服务器是完成端口模型的,用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 {...}
,为了能确定一些链接的信息,我想是用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 {...}
Wsabuf_Send.len=12;char sendBuff[12]="SOCK_STREAM";Wsabuf_Send.buf=sendBuff;
Wsabuf_Send.len=12;
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 却可以传递成功了呢?????
正好可以在WSAAccept的回调函数中来判断连接的信息,(要是非法的话,我可以拒绝),所以
我不能用AcceptEx....各位 难道你们没有用过 WSAAccept 的 回调函数吗?????
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的函数,我怎样才能让他有地方可以指向了.....??????????????????????????
去看看windows网络编程就知道了
在WSAConnect Function的文档中有
Note Connect data is supported only on ATM (RAWWAN) over a raw socket. TCP/IP in Windows does not support connect data.