您的位置:首页 > 移动开发 > Objective-C

Objective-c 服务端

2015-12-11 00:00 507 查看
//
//  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: