@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,介绍下其中包含的几个参数
SInt32:代表socket的protocol family,IPV4还是IPV6
SInt32:socket的socket 类型 就是TCP和UDP的问题
SInt32:使用的协议,这里用的是IPPROTO_TCP
CFOptionFlags:call back类型
CFSocketContext:在call back调用的函数中用到的参数值
inet_pton()是将地址存储在address struct中
创建好sockaddr struct后需要转化为CFData,用到接下来的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()接收