原始套接字:接收打印垃圾值 [英] Raw Sockets : Receiver printing garbage values

查看:139
本文介绍了原始套接字:接收打印垃圾值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想整个使用发射机和使用原始套接字接收节目的字符数组发送。我能够获得在接收器侧发送的字节的正确数目,但打印出的值是垃圾。有人能帮助我在这里?

发射器:

  INT create_raw_socket(字符* DEV)
{
结构sockaddr_ll SLL;
结构的ifreq IFR;
INT FD,IFI,RB;bzero(安培; SLL,sizeof的(SLL));
    bzero(安培; IFR,sizeof的(IFR));FD =插座(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));断言(FD!= -1);函数strncpy((字符*)ifr.ifr_name,开发,IFNAMSIZ);
IFI =的ioctl(FD,SIOCGIFINDEX,&安培; IFR);
断言(IFI!= -1);
sll.sll_protocol = htons(ETH_P_ALL);
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
RB =绑定(FD,(结构sockaddr *)及SLL,sizeof的(SLL));
断言(RB!= -1);返回FD;
 }
INT了sendpacket(字符* dev的,无符号字符* Sent_Packet的,诠释packet_len)
{
   INT num_sent = 0;
   INT sockaddress = create_raw_socket(DEV);   如果((num_sent =写(sockaddress,&安培;!Sent_Packet的,packet_len))= packet_len)
     {         关闭(sockaddress);
          返回0;
     }
   其他
     {
        关闭(sockaddress);
         返回1;
     }  }
INT主(INT ARGC,字符** argv的)
{
   INT X,FD,S;    字符* Sent_Packet的=HELLO;   INT LEN = sizeof的(Sent_Packet的);   而(1)
   {   如果(!命令sendpacket((的argv [1]),Sent_Packet的,LEN))
     PERROR(发送错误数据包);
   其他
     的printf(数据包有效载荷成功发送:%S \\ n,Sent_Packet的);
   }
    返回0;
 }

接收器:

  INT主(INT ARGC,字符** argv的)
{
 结构sockaddr地址;
 INT sock_fd时,fromlen,S;
 烧焦的buf [PACKET_LENGTH]
 字符*开发=的argv [1];
 而(1)
 {   fromlen为此= sizeof的(地址);
   sock_fd = create_raw_socket(DEV); / *创建原始套接字* /
   INT X = recvfrom的(sock_fd,&安培; BUF,sizeof的(BUF),0,&安培;地址,&安培; fromlen为此);
   的printf(接收到的数据的字节\\ n多为%d \\ n,x)的;   的printf(从客户收到的\\ nPayload ......为%s \\ n,BUF);   关闭(sock_fd); }
 返回0;
 }


解决方案

修改

 写(sockaddress,&安培; Sent_Packet的,packet_len)

 写(sockaddress,Sent_Packet的,packet_len)

Sent_Packet的已经在缓冲区的地址发送,如果你把这个地址的地址(更多precisely变量的地址拿着地址),你会读错内存缓冲区

同样,对于 recvfrom的

  recvfrom的(sock_fd,BUF,sizeof的(BUF),0,&安培;地址,&安培; fromlen为此)

I am trying to send across a character array using a transmitter and a receiver program using raw sockets. I am able to get the correct number of bytes sent at the receiver side, but the values printed out are garbage. Could someone help me out here?

Transmitter:

int create_raw_socket(char *dev) 
{   
struct sockaddr_ll sll;
struct ifreq ifr;
int fd, ifi, rb;

bzero(&sll, sizeof(sll)); 
    bzero(&ifr, sizeof(ifr));

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

assert(fd != -1);

strncpy((char *)ifr.ifr_name, dev, IFNAMSIZ);
ifi = ioctl(fd, SIOCGIFINDEX, &ifr);
assert(ifi != -1);
sll.sll_protocol = htons(ETH_P_ALL);
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
rb = bind(fd, (struct sockaddr *)&sll,sizeof(sll));
assert(rb != -1);

return fd;  
 }


int SendPacket(char *dev ,unsigned char *send_packet, int packet_len) 
{
   int num_sent= 0;
   int sockaddress = create_raw_socket(dev);

   if((num_sent = write(sockaddress, &send_packet, packet_len)) != packet_len)
     { 

         close(sockaddress);
          return 0;
     } 
   else
     { 
        close(sockaddress);
         return 1; 
     }

  }


int main(int argc, char**argv)
{
   int x,fd,s; 

    char *send_packet="HELLO";

   int len = sizeof(send_packet);

   while(1)
   {

   if(!SendPacket((argv[1]), send_packet, len))
     perror("Error sending packet");
   else
     printf("Packet sent successfully with payload : %s\n" ,send_packet);
   }
    return 0; 
 }

Receiver :

int main(int argc, char **argv)
{
 struct sockaddr addr;
 int sock_fd, fromlen,s;
 char buf[PACKET_LENGTH];
 char *dev = argv[1];


 while(1)
 {

   fromlen=sizeof(addr);
   sock_fd = create_raw_socket(dev);   /* Creating the raw socket */
   int x= recvfrom(sock_fd,&buf,sizeof(buf),0,&addr,&fromlen);
   printf("\n Number of bytes of data received is %d \n",x);

   printf("\nPayload  Received from client... is %s \n", buf);

   close(sock_fd);

 }
 return 0;
 }

解决方案

Change

write(sockaddress, &send_packet, packet_len)

to

write(sockaddress, send_packet, packet_len)

send_packet is already the address of the buffer to be sent, if you take the address of this address (more precisely the address of the variable holding the address), you will read the wrong memory for the buffer

Similarly for recvfrom:

recvfrom(sock_fd, buf, sizeof(buf), 0, &addr, &fromlen)

这篇关于原始套接字:接收打印垃圾值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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