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

11 篇文章 0 订阅
 @property (nonatomic) int errorCode;
   @property (nonatomic) CFSocketRef sockfd;
   -(instancetype)initWithAddress:(NSString *)addr andPort:(int)port;
   -(NSString *) writtenToSocket:(CFSocketRef)sockfdNum
   withChar:(NSString *)vptr;


之前的服务端监听一个特定的端口,这里就连接一个服务器的IP和端口,addr用@“localhost”

第二个方法是写入信息,服务端会返回相同信息

下面是具体的实现


#import <CoreFoundation/CFSocket.h>
   #import <sys/socket.h>
   #import <netinet/in.h>
   #import <arpa/inet.h>
<pre name="code" class="objc">-(instancetype)initWithAddress:(NSString *)addr andPort:(int)port  {
self.sockfd = CFSocketCreate(NULL, AF_INET, SOCK_STREAM,
  IPPROTO_TCP,0, NULL,NULL);
if (self.sockfd == NULL)
self.errorCode = SOCKETERROR;
else {
  struct sockaddr_in servaddr;
  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_len = sizeof(servaddr);
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(port);
  inet_pton(AF_INET, [addr cStringUsingEncoding:
  NSUTF8StringEncoding], &servaddr.sin_addr);
CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char
  *)&servaddr, sizeof(servaddr));
if (connectAddr == NULL)
self.errorCode = CONNECTERROR;
else {
         if (CFSocketConnectToAddress(self.sockfd, connectAddr, 30)
           != kCFSocketSuccess)
         self.errorCode = CONNECTERROR;
       }
}
     return self;
   }

这里用到的socket的创建方法是CFSocketCreate,介绍下其中包含的几个参数


CFAllocatorRef:和之前一样,新对象的位置,一般使用NULL或者kCFAllocatorDefault表示当前默认
SInt32:代表socket的protocol family,IPV4还是IPV6
SInt32:socket的socket 类型 就是TCP和UDP的问题

SInt32:使用的协议,这里用的是IPPROTO_TCP


CFOptionFlags:call back类型


CFOptionCallBack:call back所调用的函数

CFSocketContext:在call back调用的函数中用到的参数值


在创建好CFSocket后我们创建了一个sockaddr struct来存储要连接的server 的信息,同样滴先清理内存再设置

inet_pton()是将地址存储在address struct中


创建好sockaddr struct后需要转化为CFData,用到接下来的CFSocketConnectToAddress()中


CFSocketConnectToAddress()是用来开创一个与服务器的连接


 
</pre><pre name="code" class="objc">
<pre name="code" class="objc">-(NSString *) writtenToSocket:(CFSocketRef)sockfdNum
     withChar:(NSString *)vptr
   {
     char buffer[MAXLINE];
     CFSocketNativeHandle sock = CFSocketGetNative(sockfdnum);
     const char *mess = [vptr
       cStringUsingEncoding:NSUTF8StringEncoding];
     NSLog(@"%s", mess);
     send(sock, mess, strlen(mess)+1, 0);
     recv(sock, buffer, sizeof(buffer), 0);
     NSLog(@"%s", buffer);
     return [NSString stringWithUTF8String:buffer];
}

CFSocketGetNative是CFSocketCreateWithNative的逆向,然后将NSString转化为char 通过send()发送,recv()接收



 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值