之前試了OC自帶的socket庫進行實現,但是在向服務器發送消息包時候block了,還是用AsyncSocket好了。
1.創建socket,修改配置(允許廣播形式)
2.綁定本地IP
3.向服務器發送包
4.接收包
1.創建socket:一個客戶端只進行一條socket的連接,所以這裏使用了單例
+(Singleton *)sharedInstance{
static Singleton *sharedInstace = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstace = [[self alloc]init];
});
return sharedInstace;
}
//創建socket(UDP)
self.socket = [[AsyncUdpSocket alloc]initWithDelegate:self];
//允許廣播形式
[self.socket enableBroadcast:YES error:nil];
2.綁定本地IP
self.localhost = [self getIPAddress];
NSError *error = nil;
//綁定本地IP與端口
[self.socket bindToAddress:self.localhost port:0 error:&error];
本地IP的獲取方法:
-(NSString *)getIPAddress{
NSString *address = @"error";
struct ifaddrs *interface = NULL;
struct ifaddrs *temp_addr = NULL;
int success = 0;
success = getifaddrs(&interface);
if(success == 0){
temp_addr = interface;
while (temp_addr != NULL) {
if(temp_addr->ifa_addr->sa_family == AF_INET){
//if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]){
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
// }
}
temp_addr = temp_addr->ifa_next;
}
}
freeifaddrs(interface);
return address;
}
這個原理我還沒明白透,爲什麼其中的IPV4地址就是本地IP
3.向服務器發送包
-(void)longConnectToSocket{
NSData *dataStream = [message dataUsingEncoding:NSUTF8StringEncoding];
[self.socket sendData:dataStream
toHost:@"255.255.255.255"
port:YourPort
withTimeout:-1
tag:0];
}
廣播的IP都是255.255.255.255,端口是固定的
4.接收包
這裏在發送成功後進行了回調然後再接收包
-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{
[self.socket receiveWithTimeout:-1 tag:tag];
}
-(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
do some thing about data
return YES;
}
這兩個方法都是delegate的方法