【问题标题】:Bool array transfer from server with UDP in C使用 C 中的 UDP 从服务器传输布尔数组
【发布时间】:2021-08-15 11:29:48
【问题描述】:

我需要创建一个简单的 modbus 应用程序,以 Bool 类型将数据从服务器传输到客户端。我为此创建了客户端和服务器代码。 服务器端:

int main() {
struct sockaddr_in other_addr;
SOCKET soket, slength=sizeof(other_addr);
bool message[256]={1};
WSADATA wsa;

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
    exit(EXIT_FAILURE);
}

if ((soket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
    exit(EXIT_FAILURE);
}

memset((bool*)&other_addr, 0, sizeof(other_addr));
other_addr.sin_family = AF_INET;
other_addr.sin_port = htons(port);
other_addr.sin_addr.S_un.S_addr = inet_addr(server_addr);

while (1) {

    if (sendto(soket1, message, 256, 0, (struct sockaddr*)&other_addr, slength) == -1) {
        exit(EXIT_FAILURE);
    }
    
    printf("%d\n",message);
    printf("%d-%d-%d-%d\n", message[0], message[1], message[2], message[3]);

    //closesocket(soket);
    //WSACleanup();

}
return 0;
}

客户端:

int ImportedClient()
{
SOCKET soket;
struct sockaddr_in server_addr, other_addr;     
int slength=sizeof(other_addr), recv_length;      
bool message[256];                          
WSADATA wsa;

if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
    exit(EXIT_FAILURE);
    return 3;
}

if((soket = socket(AF_INET , SOCK_DGRAM , 0 )) == -1)
{
    exit(EXIT_FAILURE);
    return 2;
}

memset((bool *) &other_addr, 0, sizeof(other_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons( port );

if( bind(soket ,(struct sockaddr *)&server_addr , sizeof(server_addr)) == -1)
{
    exit(EXIT_FAILURE);
    return 1;
}

fflush(stdout);                 
memset(message,'0', maxdata);       

if ((recv_length = recvfrom(soket, message, 256, 0, (struct sockaddr *) &other_addr, &slength)) == -1)
{
    exit(EXIT_FAILURE);
    return 5;
}

bool x=message[0];
bool y=message[1];
bool z=message[2];
bool k=message[3];

closesocket(soket);
WSACleanup();
return 0;
}

当我开始数据传输时,'printf("%d\n", message);'代码给出输出“6422012”。但是,当使用 printf 代码一一打印消息数组的元素时,它打印正确。我无法从客户端单独或集体获取正确的数据。客户端的输出直接读取true。据我了解,当尝试从客户端读取时,它直接接受 true 因为 6422012 数据传输到客户端。需要在哪里修好才能让客户正确读取,或者需要一个个购买怎么弄? 注意:我也试过一个一个发送 x1、x2、x3,但是当我再次打印它们时,有 6... 个数字。

请帮帮我:((

【问题讨论】:

    标签: arrays sockets server boolean client


    【解决方案1】:

    根据给定的代码,message 是一个数组。 printf("%d", message); 会将message 变量 解释为十进制整数,表示“%d”。由于 message 是一个数组,因此它是该数组的第一个元素的地址。 "%d" 将此地址(不是值)解释为整数。所以你的代码将内存中的地址打印为十进制数!

    如果你想打印数组的值,printf 不能为你做,除非……:

    
        for (int i = 0; i < 256; i ++) {
            printf("%d", message[i] ? 1 : 0); /* bool interpretation */
        }
    
    

    这应该可以解决问题。

    查看以下工作示例作为回复: https://gist.github.com/be1/7f4976207cb8e2c7faf96b3aa3de6dd8

    P.S.:不要在 other_addr 或 server_addr 上使用 (bool*) 强制转换,因为它们不是 bool 类型。

    【讨论】:

    • 其实我是把printf放到服务端代码里来读取我发给客户端的。由于我将客户端代码导入到应用程序中,因此我无法使用 printf 直接读取从客户端接收到的数据。我将收到的数组的所有元素分配为 x1,x2,x3.. 并将它们一一读取为真假。但是,当我在应用程序中运行它时,即使我将整个数组分配为“0”,它们都会在客户端中给出真实的输出。如您所说,当我在服务器上使用 printf 时,我可以正确读取数据。但是,正如我所说,重要的是我需要能够从客户端获取正确的数据。
    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2015-10-08
    • 2023-04-05
    相关资源
    最近更新 更多