使用 C 中的 UDP 从服务器传输布尔数组 [英] Bool array transfer from server with UDP in C

查看:62
本文介绍了使用 C 中的 UDP 从服务器传输布尔数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

int main() {struct sockaddr_in other_addr;SOCKET soket,slength=sizeof(other_addr);布尔消息[256]={1};WSADATA wsa;如果 (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){退出(EXIT_FAILURE);}if ((soket = socket(AF_INET, SOCK_DGRAM, 0)) == -1){退出(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);而 (1) {if (sendto(soket1, message, 256, 0, (struct sockaddr*)&other_addr, slength) == -1) {退出(EXIT_FAILURE);}printf("%d\n",message);printf("%d-%d-%d-%d\n", message[0], message[1], message[2], message[3]);//关闭套接字(soket);//WSACleanup();}返回0;}

客户端:

int ImportedClient(){SOCKET 插座;struct sockaddr_in server_addr, other_addr;int slength=sizeof(other_addr), recv_length;布尔消息[256];WSADATA wsa;如果 (WSAStartup(MAKEWORD(2,2),&wsa) != 0){退出(EXIT_FAILURE);返回3;}if((soket = socket(AF_INET, SOCK_DGRAM, 0 )) == -1){退出(EXIT_FAILURE);返回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 *)&ser​​ver_addr, sizeof(server_addr)) == -1){退出(EXIT_FAILURE);返回 1;}fflush(标准输出);memset(message,'0', maxdata);if ((recv_length = recvfrom(soket, message, 256, 0, (struct sockaddr *) &other_addr, &slength)) == -1){退出(EXIT_FAILURE);返回 5;}bool x=message[0];布尔y=消息[1];bool z=message[2];bool k=message[3];关闭套接字(soket);WSACleanup();返回0;}

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

请帮帮我:((

解决方案

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

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

<预><代码>for (int i = 0; i <256; i ++) {printf(%d", message[i] ? 1 : 0);/* 布尔解释 */}

这应该可以解决问题.

请看下面的工作示例作为回复:https://gist.github.com/be1/7f4976207cb8e2c7faf96b3aa3de>6p

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

I need to create a simple modbus application to transfer data from server to client in Bool type. I created client and server codes for this. Server side:

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;
}

Client side:

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;
}

When I start data transfer, 'printf ("% d \ n", message);' code gives an output '6422012'. However, when printing the elements of the message array one by one with the printf code, it prints correctly. I cannot get the correct data individually or collectively from the client side. The output of client side reads true directly. As I understand it, when trying to read from the client, it directly accepts true because 6422012 data transfers to the client. Where do I need to fix it so that it can be read correctly by the client, or how can I get it if I need to buy one by one? Note: I've also tried sending x1, x2, x3 one by one, but again when I print them, there are 6... numbers.

Please help me :((

解决方案

According to the given code, message is an array. printf("%d", message); will interpret the message variable as a decimal integer, says "%d". As message is an array, it is then the address of the first element of that array. "%d" will interpret this address (not the value) as an integer. So your code is printing the address in memory as a decimal number!

If you want to print the values of the array, printf cannot do it for you, unless...:


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

That should do the trick.

Look at the following working example as a reply: https://gist.github.com/be1/7f4976207cb8e2c7faf96b3aa3de6dd8

P.S.: don't use (bool*) cast on other_addr or server_addr since they are not of type bool.

这篇关于使用 C 中的 UDP 从服务器传输布尔数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆