0

我正在尝试通过 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);
}
4

5 回答 5

2

那是因为您正在使用 strlen(buffer) 并且 buffer[1] 为 Null

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

于 2012-07-28T16:24:13.943 回答
1
.... strlen(buffer) ...

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

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

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

于 2012-07-28T16:23:53.863 回答
1

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

于 2012-07-28T16:24:04.440 回答
1

你正在使用这个

  strlen(buffer)

  n=sendto(sock,buffer,strlen(buffer),0,(const struct sockaddr *)&server,length);

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

于 2012-07-28T16:24:46.650 回答
-1

用这个替换你的代码:

n = sendto(sock, buffer.c_str(), buffer.size() + 1, 0, (sockaddr*)&server, sizeof(server));
于 2021-02-01T13:54:45.080 回答