Windows 如何在接受请求之前使用WSA连接和WSA接受发送接收初始化数据
作为标题,我在msdn或互联网上搜索了一个示例,但没有找到任何一个>\ubr 在所有情况下,他们都使用WSA连接(S、sa、sa_len、strongNULL、NULL、NULL、NULL/strong);溴 我想使用这些函数(WSAConnect&wsaaaccept)来创建一个简单的授权,在接受之前输入lpCallerData->bufWindows 如何在接受请求之前使用WSA连接和WSA接受发送接收初始化数据,windows,visual-c++,winsock2,Windows,Visual C++,Winsock2,作为标题,我在msdn或互联网上搜索了一个示例,但没有找到任何一个>\ubr 在所有情况下,他们都使用WSA连接(S、sa、sa_len、strongNULL、NULL、NULL、NULL/strong);溴 我想使用这些函数(WSAConnect&wsaaaccept)来创建一个简单的授权,在接受之前输入lpCallerData->buf 我已经尝试过服务器端msdn中的WSAAAccept示例和关于WSAConnect的简单代码,但它总是“lpCallerData==NULL” 对不起,我的
我已经尝试过服务器端msdn中的WSAAAccept示例和关于WSAConnect的简单代码,但它总是“lpCallerData==NULL”
对不起,我的英语不好
提前感谢您的帮助 我的非工作代码: 服务器端:
SOCKET SV_Socket;
struct sockaddr_in SV_Channel;
WORD SV_wVersionRequested;
WSADATA SV_wsaData;
int SV_on = 1;
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
//printf( "test1\n" );
//if ( memcmp( lpCallerData->buf ,"quyen194" , lpCallerData->len ) == 0 )
if ( lpCallerData->buf[0] == 'q' )
{
//memcpy( lpCalleeData->buf ,"OK" ,2 );
//lpCalleeData->len = 2;
return CF_ACCEPT;
}
else
{
//printf( "Reject request: \n" );
//printf( "Buf: " );
//printf( lpCallerData->buf );
//printf( "\nLen: %d\n" ,lpCallerData->len );
//memcpy( lpCalleeData->buf ,"NOT" ,3 );
return CF_REJECT;
}
}
void AcceptRequest()
{
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
//---- ACCEPT connection ------------------
while(true){
int socketNumb = 0;
if(AcceptRequestFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Data Transfer Listen Socket Waiting...\n",socketNumb);
//C_Socket = accept(SV_Socket,NULL,NULL); // block for connection request
C_Socket = WSAAccept(SV_Socket, (SOCKADDR*) &saClient, &iClientSize, &ConditionAcceptFunc, NULL);
if(C_Socket == INVALID_SOCKET)
{
if(AcceptRequestFunctionLogOnScreen)
if(AllErrorLogOnScreen)
printf("%d: Data Transfer Listen Socket accept failed with error: %ld\n",socketNumb,WSAGetLastError());
WSACleanup();
}
else{
if(AcceptRequestFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Request to Data Transfer Listen Socket Accepted...\n",socketNumb);
//Mark that Client Socket is inused
C_Alive = true;
//---- SEND bytes -------------------------------------------
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataSending),NULL,NULL,NULL);
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataReceiving),NULL,NULL,NULL);
while(C_Alive == true){
Sleep(10000);
}
}
}
while(shutdown(SV_Socket,SD_BOTH)){
Sleep(1000);
}
closesocket(SV_Socket);
WSACleanup();
return;
}
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
//printf( "test1\n" );
//if ((lpCallerData) && (lpCallerData->len >= 8) && (memcmp(lpCallerData->buf, "quyen194", 8) == 0))
if ((lpCallerData) && (lpCallerData->len > 0) && (lpCallerData->buf[0] == 'q'))
{
//if ((lpCalleeData) && (lpCalleeData->len > 0)) {
// memcpy( lpCalleeData->buf, "OK", 2 );
// lpCalleeData->len = 2;
//}
return CF_ACCEPT;
}
else
{
//printf( "Reject request: \n" );
//if ((lpCallerData) && (lpCallerData->len > 0)) {
// printf( "Buf: %*s", lpCallerData->len, lpCallerData->buf );
// printf( "\nLen: %d\n", lpCallerData->len );
//}
//if ((lpCalleeData) && (lpCalleeData->len > 0)) {
// memcpy( lpCalleeData->buf, "NOT", 3 );
// lpCalleeData->len = 3;
//}
return CF_REJECT;
}
}
客户端:
void Connect2Server()
{
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
LPWSABUF lpCallerData= new(WSABUF);
//WSABUF lpCalleeData;// = new(WSABUF);
lpCallerData->buf[0] = 'q';
lpCallerData->len = 1;
printf( "Source: \n" );
printf( "Buf: " );
printf( lpCallerData->buf );
printf( "\nLen: %d\n" ,lpCallerData->len );
system("pause");
//---- try CONNECT -----------------------------------------
int ReturnValue;
int TryToConnect;
int One_socketNumb = 0;
for(TryToConnect=0;TryToConnect<=10;TryToConnect++)
{
//ReturnValue = connect(C_Socket,(SOCKADDR *)&C_Channel, sizeof(C_Channel));
ReturnValue = WSAConnect( C_Socket ,(SOCKADDR *)&C_Channel ,sizeof(C_Channel) ,lpCallerData ,NULL ,NULL ,NULL );
//printf( "Result: \n" );
//printf( "Buf: " );
//printf( lpCalleeData->buf );
//printf( "Len: %d\n" ,lpCalleeData->len );
if (ReturnValue == SOCKET_ERROR){
if(Connect2ServerFunctionLogOnScreen)
if(AllErrorLogOnScreen){
printf("%d: Connect error %ld",One_socketNumb,WSAGetLastError());
printf("%d: Attempt to connect #%d to ChatP2P Server\n",One_socketNumb,TryToConnect+1);
}
Sleep(1000);
if (TryToConnect == 10)
{
WSACleanup();
return; //Couldn't connect
}
}
else{
break;
}
}
//-----------------------------------------------------------
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Connect ServerSOCKET: OK...\n",One_socketNumb);
//Mark that Server Socket is inused
C_Alive = true;
//---Connection OK
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("\n%d: Connected\n",One_socketNumb);
//---- SEND bytes -------------------------------------------
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataSending),NULL,NULL,NULL);
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataReceiving),NULL,NULL,NULL);
while(C_Alive == true){
Sleep(10000);
}
//---Close Client Socket----------
shutdown(C_Socket,SD_BOTH);
closesocket(C_Socket);
//-------------------------------------
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Disconnected\n",One_socketNumb);
WSACleanup();
return;
}
void Connect2Server()
{
...
WSABUF CallerData;
WSABUF CalleeData;
char CallerBuf = 'q';
CallerData.buf = &CallerBuf;
CallerData.len = 1;
char CalleeBuf[12] = {0};
CalleeData.buf = CalleeBuf;
CalleeData.len = 12;
printf( "Source: \n" );
printf( "Buf: %*s", CallerData.len, CallerData.buf );
printf( "\nLen: %d\n", CallerData.len );
...
ReturnValue = WSAConnect( C_Socket, (SOCKADDR *)&C_Channel, sizeof(C_Channel), &CallerData, &CalleeData, NULL, NULL );
//printf( "Result: \n" );
//printf( "Buf: %*s", CalleeData.len, CalleeData.buf );
//printf( "Len: %d\n", CalleeData.len );
...
}
void Connect2Server()
{
saClient中的结构sockaddr_;
int iClientSize=sizeof(saClient);
LPWSABUF lpCallerData=new(WSABUF);
//WSABUF lpCalleeData;//=new(WSABUF);
lpCallerData->buf[0]=“q”;
lpCallerData->len=1;
printf(“来源:\n”);
printf(“Buf:”);
printf(lpCallerData->buf);
printf(“\nLen:%d\n”,lpCallerData->len);
系统(“暂停”);
//----尝试连接-----------------------------------------
返回值;
int TryToConnect;
int One_socketNumb=0;
对于(TryToConnect=0;TryToConnectbuf);
//printf(“Len:%d\n”,lpCalleeData->Len);
if(ReturnValue==SOCKET\u错误){
if(Connect2ServerFunctionLogOnScreen)
如果(AllErrorLogOnScreen){
printf(“%d:连接错误%ld”,一个_socketNumb,WSAGetLastError());
printf(“%d:尝试将#%d连接到chatpp服务器\n”,一个\u socketNumb,尝试连接+1);
}
睡眠(1000);
如果(TryToConnect==10)
{
WSACleanup();
return;//无法连接
}
}
否则{
打破
}
}
//-----------------------------------------------------------
if(Connect2ServerFunctionLogOnScreen)
如果(所有成功登录屏幕)
printf(“%d:connectserversocket:OK…\n”,一个\u socketNumb);
//标记服务器套接字已使用
C_Alive=true;
//---连接正常
if(Connect2ServerFunctionLogOnScreen)
如果(所有成功登录屏幕)
printf(“\n%d:Connected\n”,一个\u socketNumb);
//----发送字节-------------------------------------------
CreateThread(NULL,NULL,LPTHREAD\u START\u例程(DataSending),NULL,NULL,NULL);
CreateThread(NULL,NULL,LPTHREAD\u START\u例程(数据接收),NULL,NULL,NULL);
while(C_Alive==true){
睡眠(10000);
}
//---关闭客户端套接字----------
关机(C_插座、SD_两个);
闭合插座(C_插座);
//-------------------------------------
if(Connect2ServerFunctionLogOnScreen)
如果(所有成功登录屏幕)
printf(“%d:Disconnected\n”,一个\u socketNumb);
WSACleanup();
返回;
}
lpCallerData
在wsaaaccept()
回调中始终为空,因为TCP/IP不支持在建立连接期间交换呼叫者/被呼叫者数据。这在WSAConnect()
文档中有明确说明:
注意Windows中的TCP/IP协议不支持连接数据。仅在ATM(RAWWAN)上通过原始套接字支持连接数据
wsaaaccept()
文档还说明:
如果没有呼叫者标识或呼叫者数据可用,则相应的参数将为空许多网络协议不支持连接时间呼叫方数据
lpCalleeData->len最初包含由服务提供者分配并由lpCalleeData->buf指向的缓冲区长度值为零表示不支持将用户数据传回调用方
尽管如此,即使支持它,您仍然无法正确管理WSABUF
结构。您的服务器没有检查NULL或len
溢出,并且您的客户端代码没有为WSABUF::buf
字段分配任何内存
您的代码需要看起来更像这样:
服务器端:
SOCKET SV_Socket;
struct sockaddr_in SV_Channel;
WORD SV_wVersionRequested;
WSADATA SV_wsaData;
int SV_on = 1;
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
//printf( "test1\n" );
//if ( memcmp( lpCallerData->buf ,"quyen194" , lpCallerData->len ) == 0 )
if ( lpCallerData->buf[0] == 'q' )
{
//memcpy( lpCalleeData->buf ,"OK" ,2 );
//lpCalleeData->len = 2;
return CF_ACCEPT;
}
else
{
//printf( "Reject request: \n" );
//printf( "Buf: " );
//printf( lpCallerData->buf );
//printf( "\nLen: %d\n" ,lpCallerData->len );
//memcpy( lpCalleeData->buf ,"NOT" ,3 );
return CF_REJECT;
}
}
void AcceptRequest()
{
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
//---- ACCEPT connection ------------------
while(true){
int socketNumb = 0;
if(AcceptRequestFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Data Transfer Listen Socket Waiting...\n",socketNumb);
//C_Socket = accept(SV_Socket,NULL,NULL); // block for connection request
C_Socket = WSAAccept(SV_Socket, (SOCKADDR*) &saClient, &iClientSize, &ConditionAcceptFunc, NULL);
if(C_Socket == INVALID_SOCKET)
{
if(AcceptRequestFunctionLogOnScreen)
if(AllErrorLogOnScreen)
printf("%d: Data Transfer Listen Socket accept failed with error: %ld\n",socketNumb,WSAGetLastError());
WSACleanup();
}
else{
if(AcceptRequestFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Request to Data Transfer Listen Socket Accepted...\n",socketNumb);
//Mark that Client Socket is inused
C_Alive = true;
//---- SEND bytes -------------------------------------------
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataSending),NULL,NULL,NULL);
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataReceiving),NULL,NULL,NULL);
while(C_Alive == true){
Sleep(10000);
}
}
}
while(shutdown(SV_Socket,SD_BOTH)){
Sleep(1000);
}
closesocket(SV_Socket);
WSACleanup();
return;
}
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
//printf( "test1\n" );
//if ((lpCallerData) && (lpCallerData->len >= 8) && (memcmp(lpCallerData->buf, "quyen194", 8) == 0))
if ((lpCallerData) && (lpCallerData->len > 0) && (lpCallerData->buf[0] == 'q'))
{
//if ((lpCalleeData) && (lpCalleeData->len > 0)) {
// memcpy( lpCalleeData->buf, "OK", 2 );
// lpCalleeData->len = 2;
//}
return CF_ACCEPT;
}
else
{
//printf( "Reject request: \n" );
//if ((lpCallerData) && (lpCallerData->len > 0)) {
// printf( "Buf: %*s", lpCallerData->len, lpCallerData->buf );
// printf( "\nLen: %d\n", lpCallerData->len );
//}
//if ((lpCalleeData) && (lpCalleeData->len > 0)) {
// memcpy( lpCalleeData->buf, "NOT", 3 );
// lpCalleeData->len = 3;
//}
return CF_REJECT;
}
}
客户端:
void Connect2Server()
{
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
LPWSABUF lpCallerData= new(WSABUF);
//WSABUF lpCalleeData;// = new(WSABUF);
lpCallerData->buf[0] = 'q';
lpCallerData->len = 1;
printf( "Source: \n" );
printf( "Buf: " );
printf( lpCallerData->buf );
printf( "\nLen: %d\n" ,lpCallerData->len );
system("pause");
//---- try CONNECT -----------------------------------------
int ReturnValue;
int TryToConnect;
int One_socketNumb = 0;
for(TryToConnect=0;TryToConnect<=10;TryToConnect++)
{
//ReturnValue = connect(C_Socket,(SOCKADDR *)&C_Channel, sizeof(C_Channel));
ReturnValue = WSAConnect( C_Socket ,(SOCKADDR *)&C_Channel ,sizeof(C_Channel) ,lpCallerData ,NULL ,NULL ,NULL );
//printf( "Result: \n" );
//printf( "Buf: " );
//printf( lpCalleeData->buf );
//printf( "Len: %d\n" ,lpCalleeData->len );
if (ReturnValue == SOCKET_ERROR){
if(Connect2ServerFunctionLogOnScreen)
if(AllErrorLogOnScreen){
printf("%d: Connect error %ld",One_socketNumb,WSAGetLastError());
printf("%d: Attempt to connect #%d to ChatP2P Server\n",One_socketNumb,TryToConnect+1);
}
Sleep(1000);
if (TryToConnect == 10)
{
WSACleanup();
return; //Couldn't connect
}
}
else{
break;
}
}
//-----------------------------------------------------------
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Connect ServerSOCKET: OK...\n",One_socketNumb);
//Mark that Server Socket is inused
C_Alive = true;
//---Connection OK
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("\n%d: Connected\n",One_socketNumb);
//---- SEND bytes -------------------------------------------
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataSending),NULL,NULL,NULL);
CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(DataReceiving),NULL,NULL,NULL);
while(C_Alive == true){
Sleep(10000);
}
//---Close Client Socket----------
shutdown(C_Socket,SD_BOTH);
closesocket(C_Socket);
//-------------------------------------
if(Connect2ServerFunctionLogOnScreen)
if(AllSuccessLogOnScreen)
printf("%d: Disconnected\n",One_socketNumb);
WSACleanup();
return;
}
void Connect2Server()
{
...
WSABUF CallerData;
WSABUF CalleeData;
char CallerBuf = 'q';
CallerData.buf = &CallerBuf;
CallerData.len = 1;
char CalleeBuf[12] = {0};
CalleeData.buf = CalleeBuf;
CalleeData.len = 12;
printf( "Source: \n" );
printf( "Buf: %*s", CallerData.len, CallerData.buf );
printf( "\nLen: %d\n", CallerData.len );
...
ReturnValue = WSAConnect( C_Socket, (SOCKADDR *)&C_Channel, sizeof(C_Channel), &CallerData, &CalleeData, NULL, NULL );
//printf( "Result: \n" );
//printf( "Buf: %*s", CalleeData.len, CalleeData.buf );
//printf( "Len: %d\n", CalleeData.len );
...
}
非常感谢你!你能再帮我一个忙吗?我不知道如何使用TransmitPackages函数和TransmitFile函数><我找不到任何关于它的示例!你能给我一个简单的例子,如何在客户端和服务器端使用它吗?如果你没有太多的时间,就把它写得尽可能简单:D再次感谢你