2019独角兽企业重金招聘Python工程师标准>>>
//
// main.m
// 服务端12-11
//
// Created by dc004 on 15/12/11.
// Copyright © 2015年 gang. All rights reserved.
//
#import
//提供socket函数以及数据结构
#include
//定义数据结构
#include
//提供IP地址转换函数
#include
int main() {
//服务端顺序:socket->bind->listen->while(true) accept->do while recv ->close
int fd = socket(AF_INET, SOCK_STREAM, 0);
BOOL success = (fd != -1);
struct sockaddr_in addr;
int err;
//服务端地址设置
if (success) {
NSLog(@"socket success");
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;//IPv4
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = INADDR_ANY;
//进行绑定
err = bind(fd, (const struct sockaddr*)&addr, sizeof(addr));
success = (err == 0);
}if (success) {
NSLog(@"bind成功");
//listen监听
//第二个参数为等待接收的连接的队列的大小。比如在connect请求过来的时候,完成三次握手后先将连接放到队列中,直到被accept处理。如果这个队列满了,并且又有新的连接的时候,对方可能会收到错误信息。
err = listen(fd, 5);
success = (err == 0);
}if (success) {
NSLog(@"listen success");
while (true) {
struct sockaddr_in clientaddr;
//定义客户端的套接字,用于获取接收到的客户端套接字。
int clientfd;
//定义一个地址长度变量,接收客户端的长度
socklen_t addrLen;
addrLen = sizeof(clientaddr);
NSLog(@"准备接收");
//accept函数
//第二个参数用于返回客户端的协议地址
//第三个参数为协议地址的长度
clientfd = accept(fd, (struct sockaddr*)&clientaddr, &addrLen);
success = (clientfd != -1);
if (success) {
char buf[1024];
ssize_t count;//用于接收函数的返回值
size_t len = sizeof(buf);
do{
//recv()成功返回实际读入缓冲的数据字节数。
count = recv(clientfd, buf, len, 0);
if (count < 0) {
NSLog(@"再见");
break;
}
//输出(将c语言字符串转换成oc字符串输出)
NSString *str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}while (strcmp(buf, "exit") != 0);
}
//关闭客户端:只是关闭这个套接字特定的TCP连接
close(clientfd);
}
}
return 0;
}