zoukankan      html  css  js  c++  java
  • TCP协议连接方法

    #define SOCKET_PORT  9345    (服务器端口号)
    #define SOCKET_IP    @"222.137.116.11"  (ip地址)



    //打开socket连接 长连接  双向的 (只需要该变 端口号 和  ip地址)
    - (void) connectToServer
    {
        //self 一个任意指针的数据,可以用在创建CFSocket对象时相关联。这个指针被传递给所有的上下文中定义的回调。
        CFSocketContext CTX = {0, self, NULL, NULL, NULL};
       
        _socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack, TCPServerConnectCallBack, &CTX);
       
        if (NULL == _socket)
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"创建套接字失败" delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil];
            [alert show];
            [alert release];
        }
       
       
        //sockaddr_in 配置socket的连接信息
        struct sockaddr_in addr4;
        //初始化addr4的内存
        memset(&addr4, 0, sizeof(addr4));
        //bzero(&addr4, sizeof(addr4));
        addr4.sin_len = sizeof(addr4);
        //AF_INET  ipv4
        addr4.sin_family = AF_INET;
        //将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)
        addr4.sin_port = htons(SOCKET_PORT);
        //将一个点分十进制的IP转换成一个长整数型数INET_ADDR()。
        addr4.sin_addr.s_addr = inet_addr([SOCKET_IP UTF8String]);
        // 把sockaddr_in结构体中的地址转换为Data
        CFDataRef address = CFDataCreate(kCFAllocatorDefault, (UInt8 *)&addr4, sizeof(addr4));
        // address CFDataRef类型的包含上面socket的远程地址的对象
        CFSocketConnectToAddress(_socket, address, -1);
       
        CFRunLoopRef cfrl = CFRunLoopGetCurrent();// 获取当前线程的循环
        //创建一个循环,但并没有真正加如到循环中,需要调用CFRunLoopAddSource
        CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);
        //
        CFRunLoopAddSource(cfrl, source, kCFRunLoopCommonModes);
        CFRelease(source);
    }


    //启动连接服务器后,会回调此方法
    static void TCPServerConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
    {
       
        // 当socket为kCFSocketConnectCallBack时,失败时回调失败会返回一个错误代码指针(data),其他情况返回NULL
        if (data != NULL)
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"连接失败" delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil];
            [alert show];
            [alert release];
            return;
        }
        //info  跟CFSocketContext CTX = {0, self, NULL, NULL, NULL};
        //第二个参数对应。
        LPSocketEngine *infoObject = (LPSocketEngine *)info;
       
        [infoObject userLogin];
        //其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。
        [infoObject performSelectorInBackground:@selector(readStream) withObject:nil];
    }

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/2595789.html
Copyright © 2011-2022 走看看