Socket-“套接字”給我們提供了發(fā)送和接收信息的接口把跨,通過這個接口能夠?qū)崿F(xiàn)客戶端和服務(wù)端的通信。Socket是對TCP/IP的封裝,方便了程序員的使用编兄。
1.首先,我們要建立一個Socket對象声登,通過如下的函數(shù)實現(xiàn):
int socket(int domain,int type,int protocal);
domain:協(xié)議族或者協(xié)議域狠鸳,決定Socket的地址類型;type:Socket的類型悯嗓;protocal:指定的協(xié)議件舵,常用的有TCP,UDP傳輸協(xié)議脯厨。返回值大于0的時候铅祸,表示創(chuàng)建成功。
2.建立連接
int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR *name,int namelen);
SOCKET s:客戶端Socket合武;第二個參數(shù)指向一個數(shù)據(jù)結(jié)構(gòu)的指針临梗,它包括路目的地的端口和IP涡扼;第三個參數(shù):該結(jié)構(gòu)體的長度。返回值為0表示連接成功夜焦。
3.接下來就是發(fā)送和接收指令:
ssize_t send(int,const void *,size_t,int)
第一個參數(shù)表示Socket壳澳,第二個參數(shù)表示發(fā)送內(nèi)容的地址,第三個參數(shù)表示發(fā)送內(nèi)容的長度茫经,最后一個為標(biāo)志位巷波。
ssize_t send(int,void *,size_t,int)
參數(shù)和發(fā)送差不多,第二個參數(shù)表示接受內(nèi)容的緩沖地址卸伞。
4.斷開連接
int close(int)
Demo如下:
//連接到服務(wù)器
-(BOOL)connentToHost:(NSString*)host port:(int)port{
//創(chuàng)建Socket對象
self.clientSocket=socket(AF_INET,SOCK_STREAM,0);
//端口和IP地址的結(jié)構(gòu)體
structsockaddr_inseverAddress;
severAddress.sin_family=AF_INET;
severAddress.sin_addr.s_addr=inet_addr(host.UTF8String);
severAddress.sin_port=htons(port);
return(connect(self.clientSocket, (conststructsockaddr*)&severAddress,sizeof(severAddress))==0);
}
//發(fā)送和接收
-(NSString*)sendAndRecv:(NSString*)message
{
ssize_tsendLen=send(self.clientSocket, message.UTF8String,strlen(message.UTF8String),0);
//緩沖
uint8_tbuffer[1024];
ssize_trecLen=recv(self.clientSocket, buffer,sizeof(buffer),0);
NSLog(@"buffer=%hhu",buffer[0]);
NSData*data=[NSDatadataWithBytes:bufferlength:recLen];
NSString*str=[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
returnstr;
}
//單擊連接
-(void)conn{
BOOLresult=[selfconnentToHost:self.hostText.textport:self.portText.text.intValue];
self.recText.text=result?@"成功":@"失敗";
}
//單擊發(fā)送
-(void)send{
self.recText.text=[selfsendAndRecv:self.msgText.text];
}
-(void) disconnection{
close(self.clientSocket);
}
打開終端抹镊,調(diào)試如下: