Socket(套接字)是通讯协议.通过IP地址,和端口号进行锁定传输数据.Socket支持TCP/UDP协议,一个是安全传输三次握手机制(省略)一个是分发数据包,不保证安全(省略),它是基于C语言的一套网络通讯协议.
Socket分为长连接和短连接.
1.长连接:就是始终和服务器保持连接,直至你不在需要和服务器传输数据(特点是:效率高,但是消耗资源多)
2.短连接:就是发送一次数据就将Socket关闭,再次发送再请求连接!(特点.效率稍底,但是消耗资源少.)
以下是实现简单通讯的源码.
#import<sys/socket.h>
#import<netinet/in.h>
#import<arpa/inet.h>
// 1.创建socket
/*
协议域 AF_INET (IPv4的宏,IPv6是AF_INET6)
类型 SOCK_STREAM/SOCK_DGRAM(是流数据,还是报文)
IPPROT_TCP,如果传入0或根据前一个参数自动选择
*/
int clintSocket = socket(AF_INET , SOCK_STREAM, 0);
// 2.链接服务器
/*
客户端的socket
serv_addr:套接字想要连接的主机地址和端口号。
addrlen:serv_addr缓冲区的长度。
*/
struct sockaddr_in servAddr;
// 定义协议域
servAddr.sin_family = AF_INET;
// 定义端口可以在终端上监听端口(nc -lk 54431)
servAddr.sin_port = htons((short)54431);
// 设置IP地址,链接失败,很有可能是这个问题.
servAddr.sin_addr.s_addr = inet_addr("192.168.2.1");
int connetRect = connect(clintSocket, (const struct sockaddr *)&servAddr, sizeof(servAddr));
if (connetRect ==0) {
NSLog(@"链接成功");
}else{
NSLog(@"链接失败%d",connetRect);
return;
}
//3.接收请求
/*
客户端的socket
serv_addr:套接字想要连接的主机地址和端口号。
addrlen:serv_addr缓冲区的长度。
*/
unsigned int nAddrlen = sizeof(servAddr);
int sClient = accept(clintSocket, (struct sockaddr *)&servAddr,&nAddrlen);
// 4.发送数据
/*
客户端的socket
发送内容的地址
发送内容的长度
0
*/
NSString * sendMy = @"你好";
ssize_t senlen = send( clintSocket, sendMy.UTF8String, strlen(sendMy.UTF8String), 0);
NSLog(@"发送了%ld个",senlen);
// 5.从服务器接受数据
/*
客户端socket
接受内容缓存区
接受内容长度
0
*/
uint8_t buffMy[1024];
ssize_t reclen = recv(sockMy, buffMy, sizeof(buffMy), 0);
NSString *str = [NSString stringWithCString:buffMy encoding:NSUTF8StringEncoding];
NSLog(@"接受:%@ %ld长度",str,reclen);
// 6.关闭
close(sockMy);
// 6.关闭socket
// close(clintSocket);
能力有限,只能写这么多.有什么问题欢迎大家留言指正,我看到一定回复.感谢!!!!!!!








网友评论