使用 C 中的 UDP 从服务器传输布尔数组 [英] Bool array transfer from server with UDP in C
问题描述
我需要创建一个简单的 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 *)&server_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
不能为你做,除非...:
这应该可以解决问题.
请看下面的工作示例作为回复: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: Client side: 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, If you want to print the values of the array, 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屋!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;
}
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!printf
cannot do it for you, unless...:
for (int i = 0; i < 256; i ++) {
printf("%d", message[i] ? 1 : 0); /* bool interpretation */
}