我正在编写使用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
之后立即使套接字无效,还是应该等到发送数据?感谢。
答案 0 :(得分:0)
如果我不打算发送更多数据,我应该以某种方式关闭/释放套接字吗?如果是这样,CFSocketInvalidate是否适当的函数?
是。致电CFSocketInvalidate
,然后致电CFRelease
。
我可以在调用CFSocketSendData之后立即使套接字无效,还是应该等到发送数据?
在设置了CFSocketSendData
选项的source code,sendto
来电SO_SNDTIMEO
中。
没有必要等待。如果CFSocketSendData
返回kCFSocketSuccess
,则表示您已完成。
请注意,对于TCP连接,这种情况可以是more complicated。
但是,我可以在发送过程中检测到我身边发生的一些错误吗?
你可以。使用errno
。 sendto
列出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]
可能存在的错误。