一个简单的Socket

socket c实现

需要#import <sys/socket.h>、#import <netinet/in.h>、#import <arpa/inet.h>系统头文件

1.创建一个socket: socket(int,int,int)

/*

        第一个参数是domain,协议域,AF_INET->IPV4,

        第二个参数是type,Socket 类型,有SOCK_STREAM/SOCK_DGRAM ,

        第三个参数是protocol,IPPROTO_TCP,如果是0,会自动更具第二个参数,选择合适的协议  

        返回值     socket

*/

int  clientsocket = socket(AF_INET, SOCK_STREAM, 0);

2.连接:connect(int, const struct sockaddr *, socklen_t) 

/*

        参数1.socket

        参数2.指向数据结构sockaddr的指针,其中包括目的端口和IP地址

        参数3.结构体数据长度

        返回值     0 成功/其他 错误代号

*/

     struct sockaddr_in serverAddr;   

    serverAddr.sin_family = AF_INET;   //协议域, 

    serverAddr.sin_addr.s_addr = inet_addr("192.168.2.1"); //可用本地地址

    serverAddr.sin_port = htons(45678);   

    int connectResult = connect(clientsocket, (const struct sockaddr *)&serverAddr,     sizeof(serverAddr));   

    if (connectResult == 0) {       

                NSLog(@"success...");   

    } else {       

                NSLog(@"fail...%d",connectResult); 

                return;

    }

3.发送的方法 : send(int, const void *, size_t, int)

    NSString *msg = @"hello";   

    ssize_t sendlen = send(clientsocket, msg.UTF8String, strlen(msg.UTF8String), 0);                     NSLog(@"发送了 %ld 个字节",sendlen);

4.读取的字节数

uint8_t buffer[1024];   

ssize_t recvlen = recv(clientsocket, buffer, sizeof(buffer), 0);   

NSLog(@"接收到了 %ld 个字节",recvlen);

//获取服务器返回的数据   

NSData * data = [NSData dataWithBytes:buffer length:recvlen];   

//str   

NSString * str1 =  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"数据 %@",str1);

5.关闭socket: close(int)

close(clientsocket);

//可在终端上执行 :$ nc -lk 45678 监听端口进行调试

基于GCDAsyncSocket


使用 GCDAsyncSocket 

//初始化并设置代理,和线程上

        self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self     delegateQueue:dispatch_get_main_queue()]; 

        NSError *error = nil;   

        [self.socket connectToHost:SocketHost onPort:SocketPort error:&error];  //开始连接   

         //[self.socket connectToHost:SocketHost onPort:SocketPort withTimeout:CONNECTTIMEOUT error:&error]; //设置一个连接超市时间

//错误结果   

if (error)

{

        NSLog(@"出错了 = %@",error); 

  }



代理GCDAsyncSocketDelegate:的回调

//连接成功进入的方法

- (void) socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port {

            NSLog(@"连接成功 host = %@, port= %d",host,post); 

}

//连接失败

- (void) socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {

            NSLog(@"连接失败 err = %@",err); 

}

//接收到的数据回调

- (void) socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {

        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

         NSLog(@"socket.返回数据 = %@",result);

}

发送消息的方法:

  [self.socket writeData:data withTimeout:WRITETIMEOUT tag:WRITETAG];

断开连接:

  [self.socket disconnect];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容