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;
}
相關文章
相關標籤/搜索