【发布时间】:2017-04-09 07:27:25
【问题描述】:
我正在编写原始套接字客户端(成功发送 UDP 数据包)和服务器套接字,问题出在服务器部分。
我通过以下方式创建套接字:
int raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
我也尝试过使用 IPPROTO_RAW,但得到相同的结果并且我正在绑定它:
bind(raw_socket, (struct sockaddr*)&sockstr, sizeof(sockstr))
当尝试使用套接字接收一些数据包时,我收到的唯一有效负载是“E”(我认为这意味着“错误”),或者套接字继续侦听但阻塞并且没有任何反应。 如何使用原始套接字接收 UDP 数据包? 我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
int server(){
int raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (raw_socket== -1){
perror("Socket_creation_error\n");
return 1;
}
struct sockaddr_in sockstr;
sockstr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockstr.sin_family = AF_INET;
sockstr.sin_port = htons(9090);
socklen_t s = (socklen_t)sizeof(sockstr);
if (bind(raw_socket, (struct sockaddr*)&sockstr, sizeof(sockstr))< 0){
perror("binding_err\n");
return 0;
}
char* msg[256];
memset(msg, 0, 256);
recv(raw_socket, msg, sizeof(msg), 0);
printf(msg);
return 0;
}
void main(){
server();
}
【问题讨论】:
-
如果你在 linux 上并且 ufw(unix 防火墙)正在运行 UDP 数据包默认被丢弃
-
也许你想告诉我们你写了什么
-
什么是“E”?你怎么得到“E”?
-
您应该发布minimal reproducible example 并告诉我们程序在哪个系统/权限上运行
-
DrPrItay,我已经编辑了帖子并添加了代码
标签: c sockets udp raw-sockets