c++ - 在 C++ 中通过 tcp 套接字发送结构

标签 c++ sockets tcp send recv

我正在尝试通过 tcp 套接字发送结构。我是套接字编程的新手,我确实已经尝试过这里建议的选项,但那些并没有达到我的目的。有人可以帮忙吗?

我已经编写了 Server.cpp 和 Client.cpp,并且都可以正确编译。但是,当我执行服务器以监听客户端时,我不确定服务器是否能够从客户端接收结构。另外,一旦收到这个结构,我该如何阅读?

服务器.cpp

#include<iostream>
#include <cstring>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
        struct UE
        {
        string Net;
        int imsi;
        } ;
        UE UE2;
        //cout<<UE1.imsi<<"\n"<<UE1.Net<<"\n";
        int sock, cli, receive;
        sockaddr_in server, client;
        unsigned int len;

        if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("Socket:");
                exit(-1);
        }
        server.sin_family = AF_INET;
        server.sin_port = htons(10000);
        //cout<<htons(10000);
        server.sin_addr.s_addr = INADDR_ANY;
        //cout<<INADDR_ANY;
        memset(&(server.sin_zero), '\0', 8);
        len = sizeof(struct sockaddr_in);
        if((bind(sock, (struct sockaddr *)&server, len)) == -1)
        {
                perror("Bind:");
                exit(-1);

        }
        if((listen(sock, 5)) == -1)
        {
                perror("Listen:");
                exit(-1);
        }
        while(1)
        {
                cli = accept(sock,(struct sockaddr *)&client, &len);
                if(cli == -1)
                {
                        perror("Accept");
                        exit(-1);
                }
                receive = recv(sock, (void*)&UE2, sizeof(UE2), NULL);
                cout<<UE2.imsi;
                //cout<<UE2.imsi<<"\n"<<UE2.Net;
                //int sent = send(cli, (const void*)&mesg, sizeof mesg, 0);
                //cout<<"Sent"<<sent<<" bytes to client :<<inet_ntoa(client.sin_addr)";
                close(cli);
        }
}

客户端.cpp

#include <arpa/inet.h>
#include<iostream>
#include <cstring>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
        struct UE
        {
        string Net;
        int imsi;
        } ;
        UE UE1;
        UE1.Net = "4G";
        UE1.imsi = htons(8649);
        int sock, receive;
        struct sockaddr_in server;
        char mesg[200];
        if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("Socket:");
                exit(-1);
        }
        server.sin_family = AF_INET;
        server.sin_port = htons(atoi(argv[2]));
        //cout<<server.sin.port;
        server.sin_addr.s_addr = inet_addr(argv[1]);
        //cout<<server.sin_addr.s_addr;
        memset(&(server.sin_zero), '\0', 8);
        if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1)
        {
                perror("Connect:");
                exit(-1);
        }
        int count = 0;
        while(count = 0)
        {
        send(sock, &UE1, sizeof(UE1), 0);
        //receive = recv(sock, (void*)&mesg, sizeof mesg, NULL);
        count++;
        }
        cout<<"Sent "<<UE1.imsi<<" and "<<UE1.Net<<" to Server \n";
        close(sock);
}

最佳答案

您的代码中至少有 2 个问题:

  1. 您不能发送像 std::string 这样的对象以及任何包含它的对象(正式的非 POD 数据),您需要整理您的数据。周围有很多库(例如 google proto buffers),或者您可以编写自己的库。这个主题太宽泛,无法在此处的答案中涵盖。

  2. 您不能指望通过与发送数据相同的 block 从 TCP 流接收数据,您必须编写能够处理接收数据的代码(并以这种方式发送数据)。

关于c++ - 在 C++ 中通过 tcp 套接字发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48303058/

相关文章:

C++ 模板 ByRef 与 ByVal

c++ - QMessageLogContext 的字段(如 : file, 函数、行)为空或为零

c - Winsock 接受超时

c - 从 C 中的二进制文件中读取

c# - UDP客户端-BeginReceive后如何关闭

sockets - 欢迎端口和监听端口一样吗?

C++应用程序(调试版本)包含VS运行时库msvcr90.dll和msvcr90d.dll

c++ - 为什么我可以使用删除的 move 构造函数和赋值运算符来 move 对象?

c++ - 处理 tcp/udp 接收的最佳方式。

python - 如何在扭曲的 python 中将列表从服务器发送到客户端?