ios oc socket发送与接收组播包
时间: 2023-08-18 09:08:37 浏览: 113
组播发送与接收
4星 · 用户满意度95%
在 iOS Objective-C 中使用 Socket 发送和接收组播包可以使用 MulticastSocket。MulticastSocket 可以通过一个组播地址在多个应用程序之间传输数据。
以下是一个简单的示例代码,该代码创建了一个 MulticastSocket 并发送和接收数据包:
```objc
#import <Foundation/Foundation.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#define kMulticastAddress "239.0.0.1"
#define kPortNumber 12345
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建socket
int multicastSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (multicastSocket < 0) {
NSLog(@"Failed to create multicast socket.");
return -1;
}
// 设置socket选项
int yes = 1;
setsockopt(multicastSocket, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
// 绑定端口
struct sockaddr_in multicastAddr;
memset(&multicastAddr, 0, sizeof(multicastAddr));
multicastAddr.sin_family = AF_INET;
multicastAddr.sin_addr.s_addr = htonl(INADDR_ANY);
multicastAddr.sin_port = htons(kPortNumber);
if (bind(multicastSocket, (struct sockaddr *)&multicastAddr, sizeof(multicastAddr)) < 0) {
NSLog(@"Failed to bind multicast socket.");
return -1;
}
// 加入组播组
struct ip_mreq group;
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
group.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(multicastSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&group, sizeof(group)) < 0) {
NSLog(@"Failed to join multicast group.");
return -1;
}
// 发送数据
const char *message = "Hello, world!";
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(kMulticastAddress);
serverAddr.sin_port = htons(kPortNumber);
if (sendto(multicastSocket, message, strlen(message), 0, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
NSLog(@"Failed to send multicast message.");
return -1;
}
// 接收数据
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
struct sockaddr_in clientAddr;
socklen_t clientAddrLen = sizeof(clientAddr);
ssize_t recvLen = recvfrom(multicastSocket, buffer, sizeof(buffer), 0, (struct sockaddr *)&clientAddr, &clientAddrLen);
if (recvLen < 0) {
NSLog(@"Failed to receive multicast message.");
return -1;
}
printf("Received message from %s:%d: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buffer);
// 关闭socket
close(multicastSocket);
}
return 0;
}
```
这里使用了 `socket()` 函数创建了一个 UDP Socket,然后使用 `bind()` 函数绑定端口。接着,使用 `setsockopt()` 函数将 Socket 设置为可重用的,并使用 `IP_ADD_MEMBERSHIP` 选项将 Socket 加入到组播组中。然后,使用 `sendto()` 函数发送数据,并使用 `recvfrom()` 函数接收数据。最后,使用 `close()` 函数关闭 Socket。
需要注意的是,由于 iOS 的网络安全性限制,应用程序需要在 Info.plist 文件中声明网络权限,否则无法使用 Socket。可以在 Xcode 中打开 Info.plist 文件,在其中添加 `NSAllowsArbitraryLoads` 和 `NSAllowsLocalNetworking` 权限。
阅读全文