iOS下用Socket编写服务器

来源:互联网 发布:四川大学图书馆数据库 编辑:程序博客网 时间:2024/06/05 20:57

       为了做一个通信的小例子。


/*

                       Socket 基础知识


1、 INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。

2、 INADDR_ANY指的是所有ip,即连接本机任何一个ip地址都可以连接上

3、 sin_family指代协议族,在socket编程中只能是AF_INET

4、 sin_port存储端口号(使用网络字节顺序),需要大于1024.

5、 sin_addr存储IP地址,使用in_addr这个数据结构

6、 sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

7、 s_addr按照网络字节顺序存储IP地址

8、 sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息。

*/

       在iOS下用C语言实现服务器服务器编写的代码如下:

MyServer.h:如下

#import <Foundation/Foundation.h>@interface MyServer : NSObject{    BOOL isClosed;}// 初始化服务器-(void) initServer;// 读客户端数据-(void) readData:(NSNumber*) clientSocket;// 向客户端发送数据-(void) sendData:(const char*) data;// 在新线程中监听客户端-(void) startListenAndNewThread;-(void) closeServer;@end


MyServer.m:如下

#import "MyServer.h"#include<stdio.h>#include<unistd.h>#include<strings.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#define PORT 6677#define MAXDATASIZE 100#define LENGTH_OF_LISTEN_QUEUE  20#define BUFFER_SIZE 1024#define THREAD_MAX    5NSLock *lock;@implementation MyServer// 初始化服务器-(void) initServer{    //设置一个socket地址结构server_addr,代表服务器internet地址, 端口    struct sockaddr_in server_addr;    bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0    server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htons(INADDR_ANY);    server_addr.sin_port = htons(PORT);                          //创建用于internet的流协议(TCP)socket,    //用server_socket代表服务器socket    int server_socket = socket(AF_INET,SOCK_STREAM,0);    if( server_socket < 0)    {        printf("Create Socket Failed!");        exit(1);    }                          //把socket和socket地址结构联系起来    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))    {        printf("Server Bind Port : %d Failed!", PORT);        exit(1);    }                          //server_socket用于监听    if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )    {        printf("Server Listen Failed!");        exit(1);    }                          isClosed = NO;                          while(!isClosed) //服务器端要一直运行    {        printf("Server start......\n");        //定义客户端的socket地址结构client_addr        struct sockaddr_in client_addr;        socklen_t length = sizeof(client_addr);                                  //接受一个到server_socket代表的socket的一个连接        //如果没有连接请求,就等待到有连接请求--这是accept函数的特性        //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信        //new_server_socket代表了服务器和客户端之间的一个通信通道        //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中        int new_client_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);        if ( new_client_socket < 0)        {            printf("Server Accept Failed!/n");            break;        }                                  printf(" one client connted..\n");        [NSThread detachNewThreadSelector:@selector(readData:)            toTarget:self            withObject:[NSNumber numberWithInt:new_client_socket]];    }    //关闭监听用的socket    close(server_socket);    NSLog(@"%@",@"server closed....");}// 读客户端数据-(void) readData:(NSNumber*) clientSocket{    char buffer[BUFFER_SIZE];    int intSocket = [clientSocket intValue];                          while(buffer[0] != '-'){                                  bzero(buffer,BUFFER_SIZE);        //接收客户端发送来的信息到buffer中        recv(intSocket,buffer,BUFFER_SIZE,0);                                  printf("client:%s\n",buffer);    }    //关闭与客户端的连接    printf("client:close\n");    close(intSocket);}// 向客户端发送数据-(void) sendData:(const char*) data{                      }// 在新线程中监听客户端-(void) startListenAndNewThread{    [NSThread detachNewThreadSelector:@selector(initServer)                             toTarget:self withObject:nil];}-(void) closeServer{    isClosed = YES;}@end

代码下载:  http://pan.baidu.com/share/link?shareid=1384945421&uk=3189484501



本文出自 “7087095” 博客,请务必保留此出处http://7097095.blog.51cto.com/7087095/1226462