iphone - 在iPhone上接收UDP数据包

标签 iphone sockets udp

我正在尝试通过 Wi-Fi 在 MAC 操作系统和 iPod 之间建立 UDP 通信,此时我可以从 iPod 发送数据包,并且可以看到这些数据包具有正确的 MAC 和 IP 地址(我使用wireshark来监控网络),但MAC仅在wireshark打开时才接收数据包,否则recvfrom()返回-1。

当我尝试从 MAC 传输到 iPhone 时,我得到了相同的结果,我可以看到数据包已发送,但 iPhone 似乎没有收到它们。

我正在使用下一个代码来发送:

 struct addrinfo hints; 
 int rv; 

 memset(&hints, 0, sizeof hints); 
 hints.ai_family = AF_UNSPEC; 
 hints.ai_socktype = SOCK_DGRAM;

 if ((rv = getaddrinfo(IP, SERVERPORT, &hints, &servinfo)) != 0) { 
  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
  return 1;
 }
 // loop through all the results and make a socket 
 for(p = servinfo; p != NULL; p = p->ai_next) {
  if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
   perror("talker: socket"); 
   continue;
  }   
  break;
 }

 if (p == NULL) { 
  fprintf(stderr, "talker: failed to bind socket\n"); 
  return 2;
 }
 while (cond)
  sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen); 
 return 0;

以及要接收的代码:

struct addrinfo hints, *p; 
 int rv;

 memset(&hints, 0, sizeof hints); 
 hints.ai_family = AF_UNSPEC; // set 
 hints.ai_socktype = SOCK_DGRAM; 
 hints.ai_flags = AI_PASSIVE; // use to AF_INET to force IPv4 my IP 

 if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) {
  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
  return 1;
 }
 // loop through all the results and bind to the first we can 
 for(p = servinfo; p != NULL; p = p->ai_next) {
  if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
   perror("listener: socket"); 
   continue;
  }  


  if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
   close(sockfd);
   perror("listener: bind"); 
   continue;
  } 

  break;
 }

 if (p == NULL) { 
  fprintf(stderr, "listener: failed to bind socket\n"); 
  return 2;
 } 

 addr_len = sizeof their_addr; 
 fcntl(sockfd, F_SETFL,O_NONBLOCK);

 int rcvbuf_size = 128 * 1024; // That's 128Kb of buffer space.
 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, 
       &rcvbuf_size, sizeof(rcvbuf_size));

 printf("listener: waiting to recvfrom...\n");

 while (cond)
    rcvBytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, (struct sockaddr *)&their_addr, &addr_len);

return 0;

我错过了什么?

最佳答案

最好能获得有关您发送的数据长度的更多信息。 我假设您正在尝试发送 ASCII 字符串

此外,这似乎要么从未被调用,要么是无限发送循环:

while (cond)
  sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen);

您可能想要使用实际上包含一些错误检查的代码:

发送字符串

int sendResult = send( connectedSocket, stringBuffer, stringLength, 0 );
    if (sendResult == -1)  {
        perror("Error while trying to send string!");
    }
    else {
        NSLog(@"String '%s' sent successfully", stringBuffer );
    }

接收字符串

memset( ReceiveBuffer, '\0', sizeof(ReceiveBuffer) );
    int receiveResult = recv( connectedSocket, ReceiveBuffer, sizeof(ReceiveBuffer), 0);
    if ( receiveResult == -1 ) {
        perror("recv");
    }
    else {
        NSLog(@"String received successfully: '%s'", ReceiveBuffer );
    }

关于iphone - 在iPhone上接收UDP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2730419/

相关文章:

c# - udp收不到任何数据

iphone - iOS 设备和蓝牙

iphone - 根据手机图像iphone显示图像

iOS:推送通知已停止工作

iphone - NSManagedObject 没有被持久化 - 无论我多么努力地尝试 :(

Python HL7 Listener 套接字消息确认

java - 服务器未收到 UDP 广播数据包

c# - 如何从socket连续接收数据?

javascript - 如何在angular中使用socket.io服务?

c - 接收 UDP 广播,没有分配地址与 Linux/C/IPv4 接口(interface)