// // main.m // 服务端12-11 // // Created by dc004 on 15/12/11. // Copyright © 2015年 gang. All rights reserved. // #import <Foundation/Foundation.h> //提供socket函数以及数据结构 #include <sys/socket.h> //定义数据结构 #include <netinet/in.h> //提供IP地址转换函数 #include <arpa/inet.h> 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; }