C 通过UDP套接字发送十六进制值

C 通过UDP套接字发送十六进制值,c,arrays,sockets,udp,hex,C,Arrays,Sockets,Udp,Hex,我试图通过udp套接字发送一个十六进制值数组,但我不能只接收第一个字节0x22。有什么问题吗??提前谢谢你 PD:如何使用十六进制值打印数组 /* UDP client in the internet domain */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h&

我试图通过udp套接字发送一个十六进制值数组,但我不能只接收第一个字节0x22。有什么问题吗??提前谢谢你

PD:如何使用十六进制值打印数组

/* UDP client in the internet domain */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <time.h>

void error(const char *);
int main()
{
   int sock, n;
   unsigned int length;
   struct sockaddr_in server;
   struct hostent *hp;
   char buffer[13]={0x22,0x00,0x0d,0xf4,0x35,0x31,0x02,0x71,0xa7,0x31,0x88,0x80,0x00};


   hp = gethostbyname("127.0.0.1");
   if (hp==0) error("Unknown host");

   sock= socket(AF_INET, SOCK_DGRAM, 0);
   if (sock < 0) error("socket");

   server.sin_family = AF_INET;
   bcopy((char *)hp->h_addr, 
        (char *)&server.sin_addr,
         hp->h_length);
   server.sin_port = htons(atoi("6666"));
   length=sizeof(struct sockaddr_in);
   while (1) {
     n=sendto(sock,buffer,strlen(buffer),0,(const struct sockaddr *)&server,length);
     if (n < 0) error("Sendto");
     printf("Sending Packet...\n");
     sleep(1);
   }
   close(sock);
   return 0;
}

void error(const char *msg)
{
    perror(msg);
    exit(0);
}
/*internet域中的UDP客户端*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(常量字符*);
int main()
{
int-sock,n;
无符号整数长度;
服务器中的结构sockaddr_;
结构主机*hp;
字符缓冲区[13]={0x22,0x00,0x0d,0xf4,0x35,0x31,0x02,0x71,0xa7,0x31,0x88,0x80,0x00};
hp=gethostbyname(“127.0.0.1”);
如果(hp==0)错误(“未知主机”);
sock=插座(AF_INET,sock DGRAM,0);
如果(sock<0)错误(“socket”);
server.sinu family=AF\u INET;
b复制((字符*)hp->h_地址,
(char*)和server.sin_addr,
hp->h_长度);
server.sin_port=htons(atoi(“6666”);
长度=sizeof(结构sockaddr_in);
而(1){
n=发送到(sock,buffer,strlen(buffer),0,(const struct sockaddr*)和服务器,长度);
如果(n<0)错误(“发送到”);
printf(“发送数据包…\n”);
睡眠(1);
}
关闭(袜子);
返回0;
}
无效错误(常量字符*消息)
{
佩罗尔(味精);
出口(0);
}
这是(至少部分)你的问题
strlen
用于C字符串。C字符串由
0x00
终止。缓冲区的第二个字符为零,因此
strlen
将为1。您正在发送一个字节

不要对二进制数据使用strlen,请使用要发送的实际字节数

(也不要在接收端使用字符串函数。)

这是(至少部分)你的问题
strlen
用于C字符串。C字符串由
0x00
终止。缓冲区的第二个字符为零,因此
strlen
将为1。您正在发送一个字节

不要对二进制数据使用strlen,请使用要发送的实际字节数


(也不要在接收端使用字符串函数。)

您不想使用strlen(缓冲区),因为您的数据不是字符串。strlen将返回字节长度,直到达到第一个零。

您不想使用
strlen(缓冲区)
,因为您的数据不是字符串。strlen将返回字节长度,直到达到第一个零。

这是因为您使用的是strlen(缓冲区),而缓冲区[1]为空


不要使用strlen(buffer)而使用
sizeof(buffer)

,这是因为您使用的是strlen(buffer),而buffer[1]为空

使用
sizeof(buffer)
而不是
strlen(buffer)
您正在使用此

  strlen(buffer)

它将返回1,因为缓冲区中的第二个元素是0x00

  strlen(buffer)


它将返回1,因为缓冲区中的第二个元素是0x00

n = sendto(sock, buffer.c_str(), buffer.size() + 1, 0, (sockaddr*)&server, sizeof(server));

将代码替换为以下内容:

n = sendto(sock, buffer.c_str(), buffer.size() + 1, 0, (sockaddr*)&server, sizeof(server));

括号仅用于
sizeof(typename)
,您可以在此处省略它们:
sizeof buffer
@wildplasser:除了少键入一个字符之外,还有什么好处?1)它使意图变得清晰。2) 它避免了诸如
typedef struct{…}项之类的错误;项目*项目;项目=malloc(sizeof(*项目))
(我上周在这里实际看到过;如果没有括号,这将是一个语法错误)括号仅用于
sizeof(typename)
,您可以在这里省略它们:
sizeof buffer
@wildplasser:除了少键入一个字符之外,还有什么好处?1)它清楚地说明了意图。2) 它避免了诸如
typedef struct{…}项之类的错误;项目*项目;项目=malloc(sizeof(*项目))(我上周在这里实际看到过;如果没有括号,这将是一个语法错误)