【问题标题】:Raw tcp send and recv原始 tcp 发送和接收
【发布时间】:2014-09-18 20:10:42
【问题描述】:

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

该应用程序是某种 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 数据包,我需要更改什么?

【问题讨论】:

    标签: tcp ip


    【解决方案1】:

    我自己没有这样使用原始套接字,但是 AIUI 你可能需要使用sendto() 而不是send(),并传递你在recvfrom() 调用中获得的saddr 结构。

    【讨论】:

    • 发送到 neds IP 地址。我已经准备好带有所有标头的 IP 数据包等等。我只需要将它传递给网络。可能我可以把它写到socket fd吗?
    • saddr 结构不一定包含 IP 地址。你从recvfrom 中得到了什么?
    • Recv 部分效果很好。我需要发送到网络就绪的 IP 数据包。我该怎么做?
    • 我说的是TX部分!我能找到的每个示例都使用sendto() 和代表目的地的struct sockaddr。您还必须考虑使用IP_HDRINCL 套接字选项来告诉内核 生成它自己的IP 标头。
    • 我该怎么做?可以给个示例代码吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多