socket
- 库
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
步骤一:端口和IP
#define SocketPort htons(8040)
#define SocketIP inet_addr("127.0.0.1")
// 最大连接数
static int const kMaxConnectCount = 5;
步骤二:创建socket
// 创建socket
self.serverId = socket(AF_INET, SOCK_STREAM, 0);
if (self.serverId == -1) {
NSLog(@"创建socket 失败");
return;
}
NSLog(@"创建socket 成功");
步骤3:将端口和地址 赋值给socket api
// 端口
struct sockaddr_in socketAddr;
socketAddr.sin_family = AF_INET;
socketAddr.sin_port = SocketPort;
// IP
struct in_addr socketIn_addr;
socketIn_addr.s_addr = SocketIP;
// 端口绑定IP
socketAddr.sin_addr = socketIn_addr;
// 清空
bzero(&(socketAddr.sin_zero), 8);
步骤四:绑定 socket
int bind_result = bind(self.serverId, (const struct sockaddr *)&socketAddr, sizeof(socketAddr));
if (bind_result == -1) {
NSLog(@"绑定socket 失败");
return;
}
NSLog(@"绑定socket成功");
步骤五:监听 listen
// 3: 监听socket
int listen_result = listen(self.serverId, kMaxConnectCount);
if (listen_result == -1) {
NSLog(@"监听失败");
return;
}
NSLog(@"监听成功");
步骤六:接受客户端的链接
for (int i = 0; i < kMaxConnectCount; i++) {
[self acceptClientConnet];
}
- (void)acceptClientConnet{
// 阻塞线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
struct sockaddr_in client_address;
socklen_t address_len;
// accept函数
int client_socket = accept(self.serverId, (struct sockaddr *)&client_address, &address_len);
self.client_socket = client_socket;
if (client_socket == -1) {
NSLog(@"接受 %u 客户端错误",address_len);
}else{
NSString *acceptInfo = [NSString stringWithFormat:@"客户端 in,socket:%d",client_socket];
NSLog(@"%@",acceptInfo);
[self receiveMsgWithClietnSocket:client_socket];
}
});
}
- [self receiveMsgWithClietnSocket:client_socket];
- (void)receiveMsgWithClietnSocket:(int)clientSocket{
while (1) {
// 5: 接受客户端传来的数据
char buf[1024] = {0};
long iReturn = recv(clientSocket, buf, 1024, 0);
if (iReturn>0) {
NSLog(@"客户端来消息了");
// 接收到的数据转换
NSData *recvData = [NSData dataWithBytes:buf length:iReturn];
NSString *recvStr = [[NSString alloc] initWithData:recvData encoding:NSUTF8StringEncoding];
NSLog(@"%@",recvStr);
}else if (iReturn == -1){
NSLog(@"读取消息失败");
break;
}else if (iReturn == 0){
NSLog(@"客户端走了");
close(clientSocket);
break;
}
}
}
步骤七:发送消息给客户端
const char *msg = self.sendMsgContent_tf.text.UTF8String;
ssize_t sendLen = send(self.client_socket, msg, strlen(msg), 0);
NSLog(@"发送了:%ld字节",sendLen);
// 清空文本框
self.sendMsgContent_tf.text = @"";
步骤八:关闭 客户端socket
int close_result = close(self.client_socket);
if (close_result == -1) {
NSLog(@"socket 关闭失败");
return;
}else{
NSLog(@"socket 关闭成功");
}
网友评论