使用CoreFoundation

时间:2015-07-01 07:42:14

标签: objective-c sockets udp

我正在编写使用CoreFoundation发送UDP数据包的代码。这是代码

CFSocketRef socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0u, NULL, NULL);
// ... (handle error if socket is NULL)

struct sockaddr_in sockaddr;
// ... (set fields of sockaddr)
NSData *addressData = [NSData dataWithBytes: &sockaddr length: sockaddr.sin_len];

if (CFSocketSendData(self.socket, (__bridge CFDataRef) addressData, (__bridge CFDataRef) data, 0) != kCFSocketSuccess) {
    // ... (handle error)
}

但是,我不确定,如何完成此流程,即我有以下问题:

  • 如果我不打算发送更多数据,我应该以某种方式关闭/释放套接字吗?如果是,CFSocketInvalidate是否适当的功能?
  • CFSocketSendData的文档说:“如果此函数返回kCFSocketSuccess,那么当它返回时,数据已在套接字缓冲区中排队以进行传递。”我可以在调用CFSocketSendData之后立即使套接字无效,还是应该等到发送数据?
  • 如果需要等待,我怎样才能发现数据已经发送?我能否知道是否有任何错误? (当然,我不能保证接收器能够通过UDP获取数据。但是,我能否发现在发送过程中发生在我身边的一些错误?)

感谢。

1 个答案:

答案 0 :(得分:0)

  

如果我不打算发送更多数据,我应该以某种方式关闭/释放套接字吗?如果是这样,CFSocketInvalidate是否适当的函数?

是。致电CFSocketInvalidate,然后致电CFRelease

  

我可以在调用CFSocketSendData之后立即使套接字无效,还是应该等到发送数据?

在设置了CFSocketSendData选项的source codesendto来电SO_SNDTIMEO中。

没有必要等待。如果CFSocketSendData返回kCFSocketSuccess,则表示您已完成。

请注意,对于TCP连接,这种情况可以是more complicated

  

但是,我可以在发送过程中检测到我身边发生的一些错误吗?

你可以。使用errnosendto列出def merge_sort(a,b) ac, bc = a.dup, b.dup (a.size+b.size).times.each_with_object([]) do |_,c| c << case [ac.any?, bc.any?] when [true,true] then (ac.first <= bc.first) ? ac.shift : bc.shift when [true,false] then ac.shift else bc.shift end end end a = [1,4,6,9] b = [2,5,7,8] c = merge_sort a,b #=> [1,2,4,5,6,7,8,9] 可能存在的错误。