所以我想确保我没有遗漏任何东西,并且我的脑海里有清晰的概念。
这是我的部分代码:
UDP_Msg mensajeRecibidoUdp;
struct sockaddr_in c_ain;
sock_udp=socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in c_ain;
socklen_t tam_dir;
while(1)
{
if(recvfrom(sock_udp, &mensajeRecibidoUdp, sizeof(UDP_Msg), 0,
(struct sockaddr*) &c_ain, &tam_dir) <0)
....
问题在于它等待消息到达。消息已发送,但这段代码没有得到任何东西,它没有解冻。
这是一个简单的练习,客户端已经构建好了。它从文件中获取端口,然后发送一个 UDP_Message,它是一个包含几个整数和一个数组的结构(客户端已经知道 IP 和端口)。
我认为我处理缓冲区的方式可能是错误的,但我见过的每个例子都是这样使用的。我还认为 c_ain 变量可能需要初始化,但如果我理解正确的话,情况并非如此。所以我不明白为什么进程被...阻塞,不确定什么是正确的词,并且由于很多时间过去了,警报响起并且进程被杀死(因为它应该得到信息并保持代码,但它没有)。
我可以添加很多其他信息,我尽量保持简短。我有点知道调用无法正常工作,因为它在我运行客户端-服务器时的行为方式。
编辑:绑定(bind):
bzero((char*)&dir_udp_serv,sizeof(struct sockaddr_in));
dir_udp_serv.sin_family=AF_INET;
dir_udp_serv.sin_addr.s_addr=inet_addr(HOST_SERVIDOR);
dir_udp_serv.sin_port=0;
fprintf(stderr,"SERVIDOR: Asignacion del puerto servidor: ");
if(bind(sock_udp,
(struct sockaddr*)&dir_udp_serv,
sizeof(struct sockaddr_in))<0)
{
fprintf(stderr,"ERROR\n");
close(sock_udp); exit(1);
}
第二次编辑:我刚刚意识到代码中有两个绑定(bind)。我的想法是在同一台服务器上创建两个连接,一个用于 UDP,一个用于 TCP。所以我对 UDP 和 TCP 做了同样的步骤。从我得到的答案中,我意识到这可能是错误的。即使我创建两个套接字,一个用于 UDp,一个用于 TCP,每个套接字是否只有 1 个绑定(bind)?
上面好像不是这样
此外,我不知道我应该添加更多详细信息,但服务器和客户端都在同一台计算机上,因此它们的地址都是 127.0.0.1,但这是预期的,我相信这不会改变任何原因服务器没有获取客户端发送的信息。
最佳答案
问问自己:您的客户在哪个端口上发送消息?服务器代码中的那个端口在哪里? 无处。您忘记将本地套接字绑定(bind)到本地地址(和端口):
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr("0.0.0.0");
local.sin_port = htons(PORT); // Now the server will listen on PORT.
if(bind(sock_udp, (struct sockaddr*)&local, sizeof(local)) < 0){
perror("bind");
exit(1);
}
// Now you may call recvfrom on your socket : your server is truly listening.
请注意,您只需绑定(bind)一次。无需将其放入循环中。
关于networking - recvfrom 没有收到来自客户端的任何信息,但客户端正在发送信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27611126/