我使用原始套接字编写了一个应用程序,该应用程序创建UDP数据包并发送到目的地。该应用程序运行正常,我什至看到使用Wireshark发送的数据包。现在,我希望该数据包被目标系统上的另一个应用程序捕获。我希望能够访问目标系统上的UDP标头。因此,我在dest系统上使用原始套接字创建了一个接收器。但是,我无法接收到我的应用程序的数据包。我可以使用SOCK_DGRAM套接字捕获数据包,但不能使用原始套接字捕获数据包。
我记得读过原始套接字没有端口的概念。谁能准确解释一下dest系统上发生的事情,传输层的多路分解如何工作以及ip标头的协议字段如何影响传输层的功能?
发件人代码:
int main(void){
char message[] = "This is something very useful";
int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
if(sockfd < 0){
perror("Error creating socket");
exit(1);
}
struct sockaddr_in this, other;
this.sin_family = AF_INET;
other.sin_family = AF_INET;
this.sin_port = htons(9000);
other.sin_port = htons(8000);
this.sin_addr.s_addr = INADDR_ANY;
other.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sockfd, (struct sockaddr *)&this, sizeof(this)) < 0){
printf("Bind failed\n");
exit(1);
}
char packet[64];
memset(packet, 0, 64);
struct udphdr *udph = (struct udphdr *) packet;
strcpy(packet + sizeof(struct udphdr), message);
udph->uh_sport = htons(8080);
udph->uh_dport = htons(8000);
udph->uh_ulen = htons(sizeof(struct udphdr) + sizeof(message));
udph->uh_sum = 0;
if(sendto(sockfd, packet, sizeof(struct udphdr) + sizeof(message), 0, (struct sockaddr *) &other, sizeof(other)) < 0)
perror("Error");
else
printf("Packet sent successfully\n");
close(sockfd);
return 0;
}
收件人代码:
int main(void){
int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
char message[64];
if(sockfd < 0){
perror("Error creating socket");
exit(1);
}
struct sockaddr_in this;
this.sin_family = AF_INET;
this.sin_port = htons(8000);
this.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr *)&this, sizeof(this)) < 0){
printf("Bind failed\n");
exit(1);
}
if(recv(sockfd, message, 64, 0) < 0){
perror("Error");
exit(1);
}
printf("\n\n%s\n\n", message);
close(sockfd);
return 0;
}