Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在接受请求之前使用WSA连接和WSA接受发送接收初始化数据_Windows_Visual C++_Winsock2 - Fatal编程技术网

Windows 如何在接受请求之前使用WSA连接和WSA接受发送接收初始化数据

Windows 如何在接受请求之前使用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或互联网上搜索了一个示例,但没有找到任何一个>\ubr 在所有情况下,他们都使用WSA连接(S、sa、sa_len、strongNULL、NULL、NULL、NULL/strong);溴 我想使用这些函数(WSAConnect&wsaaaccept)来创建一个简单的授权,在接受之前输入lpCallerData->buf
我已经尝试过服务器端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再次感谢你