iOS and OS X Network Programming Cookbook |Creating an echo Client(Bonjour)

之前用到CFSocket和BonjourPublishService创建并发布服务器端,这里将会用到CFSocketClient,BonjourBrowserService和BonjourResolverService


不像客户端的写法直接用CFSocket的类,这里会对CFSocketClient的init中socketaddr struct的设置进行改变

因为我们有BonjourResolveService类


-(id)initWithSockAddr:(struct sockaddr)sockaddr {
         self.sockfd = CFSocketCreate(NULL, AF_INET, SOCK_STREAM,
           IPPROTO_TCP,0, NULL,NULL);
         if (self.sockfd == NULL)
           errorcde = SOCKETERROR;
         else {
           [self logSockAddr:&sockaddr];
           CFDataRef connectAddr = CFDataCreate(NULL, (unsigned
             char *)&sockaddr, sizeof(sockaddr));
           if (connectAddr == NULL)
             errorcde = CONNECTERROR;
           else {
             CFSocketConnectToAddress(self.sockfd, connectAddr,
               30);
} }
         return self;
       }



将browser的值都显示在tableView中,cell的text就是network name,select 某一行cell进行resolve
- (void)tableView:(UITableView *)tableView
  didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  [self.view endEditing:YES];
  NSNetService *service = [browser.services
    objectAtIndex:indexPath.row];
  [resolver resolveService:service];
}



-(void)bonjourResolverNotification:(NSNotification
         *)notification {
         NSArray *addresses = (NSArray *)notification.object;
         bool sent = NO;
         if (addresses != nil) {
           NSMutableString *results = [NSMutableString
             stringWithFormat:@"sent: %@\n", textToSend.text];
           for (NSData *data in addresses) {
             struct sockaddr *addr = (struct sockaddr *)[data
               bytes];
             if (!sent && addr->sa_family == AF_INET) {
               NSString *str = textToSend.text;
               CFSocketClient *cf = [[CFSocketClient alloc]
                 initWithSockAddr:*addr];
               if (cf.errorCode == NOERROR) {
                 NSString *recv = [cf writtenToSocket:cf.sockfd
                   withChar:str];
                 [results appendFormat:@"received: %@", recv];
                 resultsView.text = results;
                 sent = YES;
                 textToSend.text = @"";
               } else {
                 NSLog(@"%@",[NSString stringWithFormat:@"Error
                   code %d recieved.  Server was not started",
                   cf.errorCode]);
               }
} }
} }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值