如何在C中使用UDP侦听数据包?

如何在C中使用UDP侦听数据包?,c,networking,network-programming,udp,C,Networking,Network Programming,Udp,我编写了这个udp receive C代码来监听流式传输的数据包,似乎代码没有进入while循环:代码的输出如下,然后它在那里停止,没有错误,尽管端口和ip都定义正确,发送数据正常: 初始化Winsock…初始化。 这是创建的套接字:128 已创建套接字。 连接到插座;然后它就留在这里,不进入循环 代码: #include<stdio.h> #include <stdlib.h> #include <stdbool.h> #include <winsoc

我编写了这个udp receive C代码来监听流式传输的数据包,似乎代码没有进入while循环:代码的输出如下,然后它在那里停止,没有错误,尽管端口和ip都定义正确,发送数据正常:

初始化Winsock…初始化。 这是创建的套接字:128 已创建套接字。 连接到插座;然后它就留在这里,不进入循环

代码:

#include<stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <winsock2.h>
#include <fcntl.h>

#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "wsock32.lib")

  int main(int argc , char *argv[])
  {
      printf("started \n");
      WSADATA wsa;
      SOCKET s;
      struct sockaddr_in server, client_addr;
      int recv_size =8192;// 2000000;
      char ser[recv_size] ;
      int count = 0;
      int addr_len;
      int bytes;
      char *message , server_reply[recv_size];

      printf("\nInitialising Winsock...");
      if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      { 
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1; 
      }

      printf("Initialised.\n");

      if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      { printf("Could not create socket : %d" , WSAGetLastError());
      }else{ printf("This is the socket that was created:  %d \n", s); }

      printf("Socket created.\n");

      server.sin_addr.s_addr = inet_addr("192.168.10.103");
      server.sin_family = AF_INET;
      server.sin_port = htonl(25000);
      addr_len = sizeof(struct sockaddr);

      if (connect(s, (struct sockaddr *)&server, sizeof(server))<0)
      { puts("connect error");return 1 ;
      }else {puts("connects to the socket"); }
      while(1) {
//        if ((recv_size = recv(s, server_reply, recv_size, 0)) == SOCKET_ERROR) {
//            puts("failed at receive");
//        }
        puts("receiving from microzed");
        bytes = recvfrom(s,ser,recv_size,0,(struct sockaddr *)&client_addr,&addr_len);
        //ser[bytes] = '\0';
        write(1,ser,bytes);

//        printf("count: %d \n ",count = count+ 1);
//        printf("data received: %d \n",ser);

      }
  puts("works \n");

 // server_reply[recv_size] = '\0';
 // printf("This is what the message reply is : %d, \n ",server_reply);

      printf("finished \n");
      return 0;
  }
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
#pragma注释(lib,“wsock32.lib”)
int main(int argc,char*argv[])
{
printf(“已启动\n”);
WSADATA wsa;
插座;
服务器中的结构sockaddr\u,客户端地址;
int recv_size=8192;//2000000;
字符序列[recv_size];
整数计数=0;
国际地址;
整数字节;
char*消息,服务器回复[recv_size];
printf(“\n初始化Winsock…”);
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
{ 
printf(“失败。错误代码:%d”,WSAGetLastError());
返回1;
}
printf(“已初始化。\n”);
if((s=套接字(AF_INET,SOCK_DGRAM,0))==无效的套接字)
{printf(“无法创建套接字:%d”,WSAGetLastError());
}else{printf(“这是创建的套接字:%d\n”,s);}
printf(“已创建套接字。\n”);
server.sin_addr.s_addr=inet_addr(“192.168.10.103”);
server.sinu family=AF\u INET;
server.sin_port=htonl(25000);
addr_len=sizeof(结构sockaddr);

如果(connect(s,(struct sockaddr*)&server,sizeof(server))我将假设这是put()和recv()之间的某种“竞争条件”,因为没有其他显示,很明显recvfrom()正在阻塞,否则,您将看到其余的输出(即“work\n”)

一种简单的测试方法是将套接字的模式设置为非阻塞

我曾尝试使用MS Visual 2015运行该代码,但运行时没有问题。 输出:

开始

正在初始化Winsock…已初始化。这是已初始化的套接字 已创建:已创建200个套接字。连接到从 微型化


addr\u len
被初始化为错误的长度。它应该是什么长度?这不是地址长度的大小吗?
addr\u len
应该是
sizeof(client\u addr)