Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 winsock send()发送包含指针的结构? 我使用Winsock .< /P>在C++中创建服务器/客户端程序_C++_C_Sockets - Fatal编程技术网

如何通过Windows winsock send()发送包含指针的结构? 我使用Winsock .< /P>在C++中创建服务器/客户端程序

如何通过Windows winsock send()发送包含指针的结构? 我使用Winsock .< /P>在C++中创建服务器/客户端程序,c++,c,sockets,C++,C,Sockets,将SLogin和Sid打包到char数组中 Sidtobuf[0] 和SLogin到buf[1] Sid从buf[0]获取 从buf[1]获取Slogin时出现问题。 这是我的代码: #include <Winsock2.h> #include <Windows.h> #include <stdio.h> #include <string> #pragma comment (lib, "ws2_32.lib") struct Sid {

SLogin
Sid
打包到
char数组中

  • Sid
    to
    buf[0]
    SLogin
    buf[1]

  • Sid
    buf[0]获取

  • buf[1]
    获取
    Slogin
    时出现问题。 这是我的代码:

    #include <Winsock2.h>
    #include <Windows.h>
    #include <stdio.h>
    #include <string>
    #pragma comment (lib, "ws2_32.lib")
    
    struct Sid
    {
        unsigned int id;
    };
    
    struct SLogin
    {
        char * login;
        char * password;
    };
    
    struct SloginRet
    {
        bool OkOrFalse;
    };
    
    SOCKET sSocket = INVALID_SOCKET;
    void Connect()
    {
    
        WSAData data;
        if(WSAStartup(MAKEWORD(2,2), &data) != NO_ERROR)
        {
            printf("WSAStartup: %d\n", WSAGetLastError());
            return;
        }
    
        sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(sSocket == INVALID_SOCKET)
        {
            printf("socket: %d\n", WSAGetLastError());
            return;
        }
    
    
        sockaddr_in service;
        memset(&service, 0, sizeof(service));
        service.sin_family = AF_INET;
        service.sin_addr.s_addr = inet_addr("127.0.0.1");
        service.sin_port = htons(5000);
    
        connect(sSocket, (SOCKADDR*)&service, sizeof(service));
    
    
        Sid idd;
        idd.id = 1001;
        char buffer[1];
    
        memcpy(&buffer[0], &idd, sizeof(idd));
    
        Sid ida;
        memcpy( &ida, &buffer[0], sizeof(int));
    
    
        printf("%d %d\n", ida.id, sizeof(buffer));
    
        SLogin login;
    
        login.login = "Vitor";
        login.password = "123";
    
        memcpy(&buffer[1], &login, sizeof(char));
    
        SLogin *pLogin = (SLogin*)buffer[1]; 
        printf("%s", pLogin->login);
    //  send(sSocket, buffer,strlen(buffer), 0);
    
        closesocket(sSocket);
        WSACleanup();
    }
    
    
    void main()
    {
        Connect();
        system("pause");
    }
    
    
    Server Recv:
    
    recv(socket,buffer,1,0);
    char buffer[1]; //receive
    
    Sid id;
    memcpy(&id, &buffer[0],sizeof(buffer[0]));
    
    SLogin login;
    memcpy(&login, &buffer[1],sizeof(buffer[1]));
    
    #包括
    #包括
    #包括
    #包括
    #pragma注释(lib,“ws2_32.lib”)
    结构Sid
    {
    无符号整数id;
    };
    结构斯洛金
    {
    字符*登录;
    字符*密码;
    };
    SloginRet结构
    {
    布尔·奥科法斯;
    };
    SOCKET sSocket=无效的_插座;
    void Connect()
    {
    WSAData数据;
    if(WSAStartup(MAKEWORD(2,2),&数据)!=无错误)
    {
    printf(“wsastartp:%d\n”,WSAGetLastError());
    回来
    }
    sSocket=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
    if(sSocket==无效的_套接字)
    {
    printf(“套接字:%d\n”,WSAGetLastError());
    回来
    }
    正在使用的sockaddr_;
    memset(&service,0,sizeof(服务));
    service.sinu family=AF\u INET;
    service.sin_addr.s_addr=inet_addr(“127.0.0.1”);
    service.sin_port=htons(5000);
    连接(sSocket,(SOCKADDR*)和服务,sizeof(服务));
    Sid-idd;
    idd.id=1001;
    字符缓冲区[1];
    memcpy(&buffer[0],&idd,sizeof(idd));
    希德·艾达;
    memcpy(&ida,&buffer[0],sizeof(int));
    printf(“%d%d\n”,ida.id,sizeof(buffer));
    SLogin登录;
    login.login=“Vitor”;
    login.password=“123”;
    memcpy(&buffer[1],&login,sizeof(char));
    SLogin*pLogin=(SLogin*)缓冲区[1];
    printf(“%s”,pLogin->login);
    //发送(sSocket,buffer,strlen(buffer),0);
    闭合插座(sSocket);
    WSACleanup();
    }
    void main()
    {
    Connect();
    系统(“暂停”);
    }
    服务器记录:
    recv(插座,缓冲器,1,0);
    字符缓冲区[1]//接收
    Sid id;
    memcpy(&id,&buffer[0],sizeof(buffer[0]);
    SLogin登录;
    memcpy(&login,&buffer[1],sizeof(buffer[1]);
    
    使用
    memcpy
    Sid
    复制到
    char-array-buf[0]
    ,(
    char-buf[1]
    ) 并从buf OK获取
    Sid

    我在SLogin上的错误

    我使用
    memcpy
    SLogin
    登录到
    buf[1]
    并从有问题的buf获取
    SLogin

    您没有分配足够的内存。您的
    buffer
    的大小只有1
    char
    sizeof(char)
    是1字节),但您正试图将12个字节填充到其中(
    sizeof(Sid)
    是4个字节,
    sizeof(SLogin)
    是8个字节)。即使您分配了足够的内存,它仍然无法工作,因为
    SLogin
    包含指向外部内存的指针,您没有将其序列化为可以安全发送/接收的连续格式

    请尝试类似以下内容:

    #pragma pack(push, 1)
    // or equivilent for your compiler
    
    struct Sid
    {
        unsigned int id;
    };
    
    struct SLogin
    {
        char login[20];
        char password[20];
    };
    
    #pragma pack(pop)
    // or equivilent for your compiler
    


    请告诉我们错误。不要将结构用作网络协议。您正在介绍至少六个依赖项,我在其他类似问题中列举了这些依赖项。定义一个应用程序协议(以八位字节为单位),并编写一个库来发送和接收它。
    #include <Winsock2.h>
    #include <Windows.h>
    #include <stdio.h>
    #include <string>
    #pragma comment (lib, "ws2_32.lib")
    
    SOCKET sSocket = INVALID_SOCKET;
    void Connect()
    {
    
        WSAData data;
        int err = WSAStartup(MAKEWORD(2,2), &data);
        if (err != NO_ERROR)
        {
            printf("WSAStartup: %d\n", err);
            return;
        }
    
        sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sSocket == INVALID_SOCKET)
        {
            printf("socket: %d\n", WSAGetLastError());
            return;
        }
    
        sockaddr_in service;
        memset(&service, 0, sizeof(service));
        service.sin_family = AF_INET;
        service.sin_addr.s_addr = inet_addr("127.0.0.1");
        service.sin_port = htons(5000);
    
        if (connect(sSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
        {
            printf("connect: %d\n", WSAGetLastError());
            closesocket(sSocket);
            return;
        } 
    
        char buffer[sizeof(Sid)+sizeof(SLogin)];
    
        Sid *pSid = (Sid*) &buffer[0];
        PSid->id = 1001;
    
        printf("%ul\n", pSid->id);
    
        SLogin *pLogin = (SLogin*) &buffer[sizeof(Sid)];
        strncpy(pLogin->login, "Vitor", 20);
        strncpy(pLogin->password, "123", 20);
    
        printf("%.20s\n", pLogin->login);
    
        //send(sSocket, buffer, sizeof(buffer), 0);
    
        closesocket(sSocket);
        WSACleanup();
    }
    
    void main()
    {
        Connect();
        system("pause");
    }
    
    char buffer[256]; //receive
    int numBytes = recv(socket, buffer, sizeof(buffer), 0);
    ...    
    Sid *pSid = (Sid*) &buffer[0];
    SLogin *pLogin = (SLogin*) &buffer[sizeof(Sid)];