gpt4 book ai didi

c - 原始套接字发送和接收

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

只是为了学习 C 中的原始套接字,我正在编写一个简单的服务器,它使用原始套接字来接收和发送消息。

我创建套接字

if ((r_sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))< 0){
perror("socket");
exit(-1);
}

然后我创建一个无限循环并开始接收、处理和回复

while(1){
if((n = recvfrom(r_sock, buffer, BUFLEN, 0, (struct sockaddr *) &client, &client_len))<0){
perror("recvfrom");
exit(-1);
}

// Discard messages not intended to the server
if(htons(udp->uh_dport) != my_port){
continue;
}

//Do whatever with the data received and then send reply to client
// ....

if((n = sendto(r_sock, udp, ntohs(udp->uh_len), 0, (struct sockaddr *) &client, client_len))<0){
perror("sendto");
exit(-1);
}
}

我没有在这里展示每个变量的定义,但为了完整起见,缓冲区是一个大小为 BUFLEN(足够大)的字符数组,udp 是一个指向缓冲区中正确位置的 struct udphdr 指针。

关键是我有另一个程序作为客户端使用标准 UDP 套接字 (SOCK_DGRAM),它被证明工作正常(我也尝试使用 netcat 以防万一)。当我向客户端发送消息时,它永远不会收到回复。似乎当服务器向客户端发送回复时,服务器本身收到了消息,而客户端什么也得不到。

所以,我的问题是:有没有办法用原始套接字解决这个问题?也就是让服务器不接收自己的消息,不让别人接收?

提前致谢!

最佳答案

我刚刚意识到这是校验和的问题...一旦我在 UDP 中得到正确的校验和,客户端就会正确接收数据包。

Wireshark 为我提供了解决方案的线索。我看到校验和未经过验证,所以我转到“编辑”>“首选项”>“协议(protocol)”>“UDP”>“如果可能的话验证 UDP 校验和”并进行了检查。

希望对你有帮助

关于c - 原始套接字发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53800179/

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