gpt4 book ai didi

iphone - 在 iOS 6 中发送 udp 数据包

转载 作者:行者123 更新时间:2023-12-03 20:51:49 24 4
gpt4 key购买 nike

我很难从 iPhone 上获取任何内容,我关注了 This Guide起初,我从 cfSocketRef 开始,因为我认为您通过更改协议(protocol)将它们用于 UDP 和 TCP,但我没有运气。

这里是 BSD 套接字的代码。好像没有什么要发送的。我有一个 java 套接字服务器在 localhost:port 上等待。

有什么想法吗?或者可能是一个有效的指南/示例 xcode 项目。

    #import "ViewController.h"
#include <CFNetwork/CFNetwork.h> //temp //dont leave here put it in a header
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

@interface ViewController ()

@end

@implementation ViewController


static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
type, CFDataRef address, const void *data, void *userInfo)
{
NSLog(@"socketCallback called");
}
//

- (void)viewDidLoad
{
[super viewDidLoad];

int sock = 0; /// ?
unsigned int echolen;

NSLog(@"starting udp testing");
cfSocketRef = CFSocketCreate(/*CFAllocatorRef allocator*/ NULL,
/*SInt32 protocolFamily*/ PF_INET,
/*SInt32 socketType*/ SOCK_DGRAM,
/*SInt32 protocol*/ IPPROTO_UDP,
/*CFOptionFlags callBackTypes*/ kCFSocketAcceptCallBack | kCFSocketDataCallBack,
/*CFSocketCallBack callout*/ (CFSocketCallBack)socketCallback,
/*const CFSocketContext *context*/ NULL);



struct sockaddr_in destination;
memset(&destination, 0, sizeof(struct sockaddr_in));
destination.sin_len = sizeof(struct sockaddr_in);
destination.sin_family = AF_INET;

NSString *ip = @"localhost";
destination.sin_addr.s_addr = inet_addr([ip UTF8String]);
destination.sin_port = htons(33033); //port


NSString *msg = @"message sent from iPhone";
/* server port */
setsockopt(sock,
IPPROTO_IP,
IP_MULTICAST_IF,
&destination,
sizeof(destination));

const char *cmsg = [msg UTF8String];

echolen = strlen(cmsg);


if (sendto(sock,
cmsg,
echolen,
0,
(struct sockaddr *) &destination,
sizeof(destination)) != echolen)
{
NSLog(@"did send");
}
else
{
NSLog(@"did not send");
}


}





- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

最佳答案

第一个问题:您忘记创建套接字:

if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
NSLog(@"Failed to create socket, error=%s", strerror(errno));
}

这部分不起作用:

NSString *ip = @"localhost";
destination.sin_addr.s_addr = inet_addr([ip UTF8String]);

inet_addr 转换以点表示法表示 IPv4 地址的字符串,例如“127.0.0.1”。

要将“localhost”等主机名转换为 IP 地址,您必须使用 gethostbynamegetaddrinfo(后者适用于 IPv4 和 IPv6)。

检查sendto的返回值时还有一个错误:sendto成功时返回发送的字节数,错误时返回(-1) 。所以它应该看起来像:

if (sendto(sock, ...) == -1) {
NSLog(@"did not send, error=%s",strerror(errno));
} else {
NSLog(@"did send");
}

检查 errno 的值会很快发现您的问题。如果忘记创建套接字,错误消息为

did not send, error=Socket operation on non-socket

备注:

  • cfSocketRef 在您的函数中完全未使用。
  • 为什么要设置 IP_MULTICAST_IF 套接字选项?据我所知,单播消息不需要,仅多播消息需要。

关于iphone - 在 iOS 6 中发送 udp 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13047661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com