我正在使用原始套接字创建应用程序并需要您的建议:
该应用程序是某种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数据包,我需要更改什么?
答案 0 :(得分:0)
我自己没有以这种方式使用原始套接字,但AIUI你可能需要使用sendto()
代替send()
,并传递saddr
结构您是在recvfrom()
电话中获得的。