【发布时间】:2018-12-16 07:14:41
【问题描述】:
只是为了学习 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);
}
}
我没有在这里展示每个变量的定义,但为了完整起见,buffer 是一个大小为 BUFLEN(足够大)的 char 数组,而 udp 是一个指向缓冲区中正确位置的 struct udphdr 指针。
关键是我有另一个程序使用标准 UDP 套接字 (SOCK_DGRAM) 作为客户端,它被证明可以正常工作(我也尝试使用 netcat 以防万一)。当我向客户端发送消息时,它永远不会收到回复。看来,当服务器向客户端发送回复时,服务器自己得到消息,而客户端什么也得不到。
所以,我的问题是:有没有办法用原始套接字解决这个问题?也就是让服务器不接收自己的消息,阻止别人接收?
提前致谢!
【问题讨论】:
标签: c linux sockets networking udp