原始tcp发送和接收

原始tcp发送和接收,tcp,ip,Tcp,Ip,我正在使用原始套接字制作一个应用程序,需要您的建议: 该应用程序是某种tcp/ip堆栈的测试程序。 我需要的是,我有一个与远程服务器连接并将一些数据传输到id的应用程序。 比方说,我无法从我的应用程序中打开套接字,我所拥有的只是带有所有头的tcp/Ip缓冲区等等 为了进行测试,我想制作2个原始套接字-1个用于发送,1个用于接收ip缓冲区 对于接收,我有以下代码: int saddr_size , data_size; struct sockaddr saddr; unsigned char

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

该应用程序是某种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;

那么,如果我想发送准备好的IP数据包并获取原始IP数据包,我需要更改什么呢?

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

发送到neds IP地址。我已经准备好了包含所有头的IP包等等。我只需要把它传给网络。我可以把它写到socket fd吗?
saddr
结构不一定包含IP地址。您从
recvfrom
中得到的内容是什么?Recv部分工作得很好。我需要发送网络就绪的IP数据包。我该怎么做?我说的是TX部分!我能找到的每个示例都使用
sendto()
和表示目标的
struct sockaddr
。您还必须考虑<代码> IPH-HDRSCNL< /Cord>套接字选项,以告诉内核不生成它自己的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