gpt4 book ai didi

linux - 未在原始套接字上接收到正确的数据

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:24 24 4
gpt4 key购买 nike

我已经编写了最简单的原始套接字示例,通过协议(protocol)号 = 5(未被标准协议(protocol)用完)的原始套接字将数据从一个应用程序发送到另一个应用程序。

这是我的代码:

发件人

void sendRawData(char sendString[] )
{

int sock;
struct sockaddr_in server_addr;
struct hostent *host; //hostent predefined structure use to store info about host host = (struct hostent *) gethostbyname(server);//gethostbyname returns a pointer to hostent
if ((sock = socket(AF_INET, SOCK_RAW, 5)) == -1)
{
perror("socket");
exit(1);
}

//destination address structure
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(NOT_REQ); // NOT_REQ is 2000 but for SOCK_RAW sockets, it should be useless.
server_addr.sin_addr = *((struct in_addr *)host->h_addr); //host->h_addr gives address of host
bzero(&(server_addr.sin_zero),8);
sendto(sock, sendString, strlen(sendString), 0,(struct sockaddr *)&server_addr, sizeof(struct sockaddr));

//sendto() function shall send a message through a connectionless-mode socket.
printf("\nFORWARD REQUEST : '%s' has been forwarded to server\n",sendString);
close(sock);
}

接收者

int main(int argc, char **argv){
int sock = 0, len, addr_len;
char rec_buff[5000];

struct sockaddr_in address,
server_addr_udp,
client_addr;

if ((sock = socket(AF_INET, SOCK_RAW, 5)) == -1) //Creating a UDP Socket
{

perror("Socket");
exit(1);
}

server_addr_udp.sin_family = AF_INET;
server_addr_udp.sin_port = htons(2004); // again it should be useless
server_addr_udp.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr_udp.sin_zero),8);
addr_len = sizeof(struct sockaddr);
if (bind(sock,(struct sockaddr *)&server_addr_udp, sizeof(struct sockaddr)) == -1)//Binding UDP socket
{
perror("Bind");
exit(1);
}

len = recvfrom(sock, rec_buff,5000,0,(struct sockaddr *)&client_addr, &addr_len);
printf("ip = %s, port = %d\n", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
printf("%s\n", rec_buff);
main(0, NULL);
return 0;
}

我观察到的是接收方,我收到的数据不正确。如果我将套接字类型更改为 SOCK_DGRAM 和协议(protocol) = IPPROTO_UDP,则一切正常。我的意图是使用自定义协议(protocol)号 (5),因为世界上的每个数据包都不需要是 UDP/TCP 数据包。

谁能告诉我哪里出错了。

输出

ip = 127.0.0.1, port = 0
E

最佳答案

答案非常简单 :)。当您收到原始 IP 数据报时,它始终包含 IP header 。 (提示 - 检查 recvfrom() 的返回值并将其与 sendto() 的返回值进行比较将帮助您意识到这一点,正如我在之前的评论中指出的那样)。

因此您可以正确解析 IP header 以获取您的有效负载,或者您可以假设 IP header 大小始终为 20 字节并简单地快进到它。

关于linux - 未在原始套接字上接收到正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37284487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com