通过UDP套接字发送HEX值

时间:2012-07-28 16:20:24

标签: c arrays sockets udp hex

我正在尝试通过udp套接字发送一个十六进制值数组,但我不仅可以接收firt字节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);
}

5 个答案:

答案 0 :(得分:2)

那是因为你正在使用strlen(缓冲区)而缓冲区[1]是Null

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

答案 1 :(得分:1)

.... strlen(buffer) ...

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您正在使用此

  strlen(buffer)

  n=sendto(sock,buffer,strlen(buffer),0,(const struct sockaddr *)&server,length);
由于缓冲区中的第二个元素是0x00

将返回1

答案 4 :(得分:-1)

用这个替换你的代码:

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