networking - recvfrom 没有收到来自客户端的任何信息,但客户端正在发送信息

标签 networking c sockets

所以我想确保我没有遗漏任何东西,并且我的脑海里有清晰的概念。

这是我的部分代码:

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/

相关文章:

c - 套接字发送和接收缓冲区

C 套接字 - 消息只发送一次

python - 如何在Python中通过套接字建立连接?

php - 将 MYSQL 连接到网络服务器

Java 线程不会暂停 I/O 操作

c++ - 在 C/C++ 中生成遵循正态分布的随机数

C VC8 项目可执行文件未在未安装 vc8 的计算机上执行

c - 在 C 中使用指针表达式迭代二维数组

c# - 适用于 Windows 和 Linux 的同一台机器上的套接字

networking - 在应用程序中一起使用 pyglet、twisted、pygtk