之前用到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;
}
- (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]);
}
} }
} }