原始tcp发送和recv

时间:2014-07-27 13:56:46

标签: tcp ip

我正在使用原始套接字创建应用程序并需要您的建议:

该应用程序是某种tcp / ip堆栈的测试程序。 我需要的是我有一个连接远程服务器并将一些数据传输到id的应用程序。 让我们说 - 我无法从我的应用程序中打开套接字 - 我所拥有的只是带有所有标头的tcp / ip缓冲区等等。

为了进行测试,我想制作2个原始套接字 - 1个用于发送,1个用于接收ip缓冲区。

接收我有这个代码:

int saddr_size , data_size;
struct sockaddr saddr;


unsigned char *buffer = (unsigned char *)malloc(65536); //Its Big!

printf("Starting...\n");
//Create a raw socket that shall sniff
sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
if(sock_raw < 0)
{
    printf("Socket Error\n");
    return 1;
}
while(1)
{
    saddr_size = sizeof saddr;
    //Receive a packet
    data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
    if(data_size <0 )
    {
        printf("Recvfrom error , failed to get packets\n");
        return 1;
    }
    printf("Data size = %d", data_size);

}
close(sock_raw);
printf("Finished");
return 0;

正如我所看到的那样 - 它可以获取所有TCP / IP数据包。

对于发件人我试过这个

  static const unsigned char pkt6[60] = {
0x32, 0x04, 0x34, 0xed, 0xf3, 0xab, 0x01, 0x02, /* 2.4..... */
0x03, 0x04, 0x05, 0x06, 0x08, 0x00, 0x45, 0x00, /* ......E. */
0x00, 0x2e, 0x00, 0x02, 0x00, 0x00, 0xff, 0x06, /* ........ */
0x44, 0xc5, 0xc0, 0xa8, 0x01, 0x02, 0xac, 0x11, /* D....... */
0x09, 0x47, 0x00, 0x08, 0x1a, 0x0b, 0x00, 0x00, /* .G...... */
0x19, 0x6e, 0x23, 0x17, 0xc8, 0x36, 0x50, 0x18, /* .n#..6P. */
0x08, 0x60, 0x2b, 0xb9, 0x00, 0x00, 0x6c, 0x6f, /* .`+...lo */
0x6f, 0x6c, 0x0a, 0x00                          /* ol.. */
};

if((s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
 perror("error:");
 exit(EXIT_FAILURE);
   }


while(1) {
  if(send(s, pkt6, sizeof(pkt6), 0)< 0)
      perror("error::");
 }
   }

它总是说

error:: Destination address required

那么如果我想发送READy IP数据包并获取原始ip数据包,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

我自己没有以这种方式使用原始套接字,但AIUI你可能需要使用sendto()代替send(),并传递saddr结构您是在recvfrom()电话中获得的。