Objective-c 客户端

//
//  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->connect->send->close
    
    //创建一个套接字
    //套接字:源IP地址和目的IP地址 以及 源端口号和目的端口号的组合。用于标识客户端请求的服务器。
    //int socket(int domain, int type, int protocol);
    //domain:定义域,目前只支持AF_INET格式
    //type:套接字类型描述。SOCK_STREAM流式(TCP),SOCK_DGRAM数据报式(UDP)
    //protocol:套接字所用协议。如不想指定,可用0表示
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    //只要不等于-1,表示创建成功。
    BOOL success = (fd != -1);
    //sockaddr_in 是网络环境下套接字的地址形式
    struct sockaddr_in addr;
    //创建整型变量,用于体现网络连接中的错误
    int err;
    if (success) {
        NSLog(@"socket success");
        //内存初始化
        //sizeof:计算数据空间字节数
        memset(&addr, 0, sizeof(addr));
        //对addr结构体进行设置
//        addr.sin_len = sizeof(addr);
        //AF_INET通过IPv4进行通信
        addr.sin_family = AF_INET;
        //设置网络地址
        //INADDR_ANY指定地址为0.0.0.0的地址。表示一个不确定地址,或想象成一个“任意地址”。
        addr.sin_addr.s_addr = INADDR_ANY;
        //将socket与特定主机地址与端口号进行绑定,成功绑定会返回0,失败为-1.
        err = bind(fd, (const struct sockaddr*)&addr, sizeof(addr));
        success = (err == 0);//if(err==0){success = true;}
        
    }if (success) {
        NSLog(@"bind success");
        //创建要连接的服务器地址
        struct sockaddr_in serveraddr;
        //内存初始化
        memset(&serveraddr, 0, sizeof(serveraddr));
        //设置结构体(host to net shot)
        serveraddr.sin_port = htons(1024);//将主机的无符号短整型转换成网络字节顺序
        serveraddr.sin_len = sizeof(serveraddr);
        serveraddr.sin_family = AF_INET;
        //设置服务器地址
        serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");//这个地址是本地,一般用来测试使用。
        NSLog(@"连接ing");
        //客户端向服务器发送连接请求,连接成功返回0,失败返回-1.
        err = connect(fd, (const struct sockaddr*)&serveraddr, sizeof(serveraddr));
        success = (err == 0);
        socklen_t addrLen = sizeof(serveraddr);//客户端地址长度
        if (success) {
            NSLog(@"连接成功");
            getsockname(fd, (struct sockaddr *)&addr, &addrLen);
            success = (err == 0);
            if (success) {
                //inet_ntoa:将一个IP转换成互联网标准点分格式的字符串
                //ntohs:将网络字节顺序转换为主机字节顺序
                NSLog(@"本地地址:%s,端口号:%d",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
                //发送消息
                char buf[1024];
                do{
                    printf("请输入信息:");
                    //puts类似scanf,但是可以有空格
//                    puts(buf);
                    scanf("%s",buf);
                    send(fd, buf, 1024, 0);
                }while (strcmp(buf, "exit") != 0);//当输入exit跳出循环,结束
                    
            }
        }else{
            
            NSLog(@"connect 失败");
        }
        
    }
    
    
    
    return 0;
}


转载于:https://my.oschina.net/u/2483781/blog/542928

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值