美文网首页
Socket(一)笔记 C实现

Socket(一)笔记 C实现

作者: 952625a28d0d | 来源:发表于2017-01-21 16:27 被阅读67次

引入C头文件

#import <sys/types.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>```


- 初始化Socket并连接服务器

pragma mark -- 初始化Socket方法

static int CreateClinetSocket()
{
int ClinetSocket = 0;
//创建一个socket,返回值为Int。(注scoket其实就是Int类型)
//第一个参数addressFamily IPv4(AF_INET) 或 IPv6(AF_INET6)。
//第二个参数 type 表示 socket 的类型,通常是流stream(SOCK_STREAM) 或数据报文datagram(SOCK_DGRAM)
//第三个参数 protocol 参数通常设置为0,以便让系统自动为选择我们合适的协议,对于 stream socket 来说会是 TCP 协议(IPPROTO_TCP),而对于 datagram来说会是 UDP 协议(IPPROTO_UDP)。
ClinetSocket = socket(AF_INET, SOCK_STREAM, 0);
return ClinetSocket;
}


- 连接服务器

pragma mark -- 连接到服务器

static int ConnectionToServer(int client_socket,const char * server_ip,unsigned short port)
{
//生成一个sockaddr_in类型结构体
struct sockaddr_in sAddr={0};
sAddr.sin_len=sizeof(sAddr);

//设置IPv4
sAddr.sin_family=AF_INET;

//inet_aton是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址
//如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。
inet_aton(server_ip, &sAddr.sin_addr);

//htons是将整型变量从主机字节顺序转变成网络字节顺序,赋值端口号
sAddr.sin_port=htons(port);

//用scoket和服务端地址,发起连接。
//客户端向特定网络地址的服务器发送连接请求,连接成功返回0,失败返回 -1。
//注意:该接口调用会阻塞当前线程,直到服务器返回。
if (connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr))==0) {
    return client_socket;
}
return 0;

}


  • (void)initScoket
    {
    //每次连接前,先断开连接
    if (_clientScoket != 0) {
    [self disConnect];
    _clientScoket = 0;
    }
    //创建客户端socket
    _clientScoket = CreateClinetSocket();
    //服务器Ip
    const char * server_ip="127.0.0.1";
    //服务器端口
    short server_port=6969;
    //等于0说明连接失败
    if (ConnectionToServer(_clientScoket,server_ip, server_port)==0) {
    printf("Connect to server error\n");
    return ;
    }
    //走到这说明连接成功
    printf("Connect to server ok\n");
    }

- 往服务器发消息

pragma mark -- 发送消息

  • (void)sendMsg:(NSString *)msg
    {
    // 转成C字符串
    const char *send_Message = [msg UTF8String];
    // 调用send方法 发送字符串到服务器
    send(self.clientScoket,send_Message,strlen(send_Message)+1,0);
    }

- 开辟一个常驻线程 调用一个死循环来一直监听并接受服务器发来的消息

pragma mark -- 收到消息

  • (void)recieveAction{

    // 死循环一直调用来收消息
    while (1) {
    // 开辟一块内存 用来接收 或者缓冲消息
    char recv_Message[1024] = {0};
    recv(self.clientScoket, recv_Message, sizeof(recv_Message), 0);
    printf("%s\n",recv_Message);
    }
    }


- 断开连接

pragma mark -- 断开连接

  • (void)disConnect
    {
    //关闭连接
    close(self.clientScoket);
    }


###服务器

使用node服务器实现 

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 6969;

// 创建一个TCP服务器实例,调用listen函数开始监听指定端口
// 传入net.createServer()的回调函数将作为”connection“事件的处理函数
// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的
net.createServer(function(sock) {

// 我们获得一个连接 - 该连接自动关联一个socket对象  
console.log('CONNECTED: ' +  
    sock.remoteAddress + ':' + sock.remotePort);  
    sock.write('服务端发出:连接成功');  

// 为这个socket实例添加一个"data"事件处理函数  
sock.on('data', function(data) {  
    console.log('DATA ' + sock.remoteAddress + ': ' + data);  
    // 回发该数据,客户端将收到来自服务端的数据  
    sock.write('You said "' + data + '"');  
});  

// 为这个socket实例添加一个"close"事件处理函数  
sock.on('close', function(data) {  
    console.log('CLOSED: ' +  
    sock.remoteAddress + ' ' + sock.remotePort);  
});  

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT); ```

  • 收到消息后代理发出去
if (self.delegate && [self.delegate respondsToSelector:@selector(receiveMessage:)]) {
            [self.delegate receiveMessage:[NSString stringWithFormat:@"%s",recv_Message]];
        }
  • 接收
- (void)receiveMessage:(NSString *)message{
    NSLog(@"收到的消息为%@",message);
    dispatch_async(dispatch_get_main_queue(), ^{
        self.receiveMessageTF.text = message;
    });
}

搭建一个简单的界面测试一下

  • 终端启动服务端
node Server.js```

发送消息

![Socket.gif](https://img.haomeiwen.com/i189984/d2e88721e3319df1.gif?imageMogr2/auto-orient/strip)


相关文章

  • Socket(一)笔记 C实现

    引入C头文件 pragma mark -- 初始化Socket方法 static int CreateClinet...

  • socket-环信 number two

    实现Socket服务端监听: 1:使用C语言实现 2:使用CocoaAsyncSocket(OC)内部是对C的封装...

  • Socket

    socket c语言实现 需要#import 、#import 、#import ...

  • Linux_socket编程入门(C++)

    Linux_socket编程入门(C++) 参考资料 参考:这里,还有这里 实现思路 Socket编程主要分为两部...

  • 网络编程

    Linux Socket编程(不限Linux) C/C++ socket编程教程:1天玩转socket通信技术 一...

  • iOS简单实现Socket服务端监听

    实现socket的监听方法 使用c语言 使用CocoaAsyncSocket框架(内部对C的封装)下载 1.创建命...

  • 一、项目分析

    点对点的通信 采用C/S模型 客户端使用Qt实现 linux + socket 一、功能模型

  • 网络编程

    python学习笔记-网络编程 socket编程: socket()函数:socket.socket([famil...

  • Objective-C 实现socket

    对于微博、微信朋友圈之类的网络通信,使用JSON完全可以满足需求,但是如果要制作网络游戏,就需要建立一个持久连接,...

  • 使用OC二进制流进行发送消息

    //ios这里实现socket的链接,使C语言//1.与服务器通过三次握手实现链接NSString *host =...

网友评论

      本文标题:Socket(一)笔记 C实现

      本文链接:https://www.haomeiwen.com/subject/ipfnbttx.html