Socket網路編程,socket

來源:互聯網
上載者:User

Socket網路編程,socket
Socket網路編程網路通訊三要素:

  • IP地址[主機名稱]
    • 網路中裝置的標識
    • 本地迴環地址:127.0.0.1 主機名稱:localhost
  • 連接埠號碼
    • 用於標識進程的邏輯地址
    • 有效連接埠:0~65535
    • 其中0~1024由系統使用或者保留連接埠,開發中不要使用1024一下的連接埠
  • 傳輸協議[通訊的規則]
    • TCP
    • UDP
常見網路通訊協定
協議 連接埠 說明
HTTP 80 超文字傳輸通訊協定 (HTTP)
HTTPS 443 HTTP+SSL,HTTP的安全版
FTP 20,21,990 檔案傳輸
POP3 110 郵件協議
SMTP 25 簡易郵件傳輸通訊協定
telnet 23 遠程終端協議
網路參考模型

TCP & UDPUDP(User Datagram Protocol 使用者資料報)
  • 只管發送,不確認對方是否接收到
  • 將資料及源和目的封裝成資料包中,不需要建立串連
  • 每個資料報的大小限制在64k之內
  • 因為無需串連,因此是不可靠協議,但是傳輸速度快
TCP(Transmission Control Protocol 傳輸控制通訊協定)
  • 需要建立串連,形成傳輸資料通道
  • 在串連中進行大資料傳遞(資料大小不受限制)、
  • 通過三向交握完成串連,是可靠協議,安全送達
  • 必須建立串連,所以效率比較低
Socket百度百科上的解釋
  • Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通訊機制,取後一種意思。通常也稱作”通訊端”,用於描述IP地址和連接埠,是一個通訊鏈的控制代碼。在Internet上的主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並綁定到一個連接埠上,不同的連接埠對應於不同的服務。Socket正如其英文原意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務。
Socket的作用
  • Socket就是為網路服務提供的一種機制
    • 在Unix中,網路既是Socket,並不局限在TCP/UDP
    • Socket可以用於自訂協議
  • 通訊的兩端都是Socket
  • 網路通訊其實就是Socket間的通訊
  • 資料在兩個Socket間通過IO傳輸
Socket通訊

Scoket開發
  • 開發前準備-匯入標頭檔

    #import <sys/socket.h>

    #import <netinet/in.h>

    #import <arpa/inet.h>
  • 函數說明

    1.scoket函數

    • 函數原型:
      int socket(int domain, int type, int protocol);
    • 參數說明
      • domain: 協議域,又稱協議族(family)。常用的協議族有AF_INET、AF_INET6、AF_LOCAL(或稱AF_UNIX,Unix域Socket)、AF_ROUTE等。協議族決定了socket的地址類型,在通訊中必須採用對應的地址,如AF_INET決定了要用ipv4地址(32位的)與連接埠號碼(16位的)的組合、AF_UNIX決定了要用一個絕對路徑名作為地址。
      • type:指定Socket類型。常用的socket類型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式Socket(SOCK_STREAM)是一種連線導向的Socket,針對於連線導向的TCP服務應用。資料報式Socket(SOCK_DGRAM)是一種不需連線的Socket,對應於不需連線的UDP服務應用。
      • protocol: 指定協議。常用協議有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,分別對應TCP傳輸協議、UDP傳輸協議、STCP傳輸協議、TIPC傳輸協議。
        注意:type和protocol不可以隨意組合,如SOCK_STREAM不可以跟IPPROTO_UDP組合。當第三個參數為0時,會自動選擇第二個參數類型對應的預設協議。
    • 傳回值
      • 如果調用成功就返回新建立的通訊端的描述符,如果失敗就返回INVALID_SOCKET(Linux下失敗返回-1)。通訊端描述符是一個整數類型的值。
    • int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    2.connect函數

    • 函數原型:int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR* name, int namelen);
    • 參數說明
      • s:標識一個未串連socket
      • name:指向要串連通訊端的sockaddr結構體的指標

        struct sockaddr_in serverAddr;
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(12345);
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
      • namelen:sockaddr結構體的位元組長度
    • 傳回值
      • 成功則返回0, 失敗返回-1, 錯誤原因存於errno 中。
    • int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));

      注意:在 C 語言開發中,經常傳遞一個資料結構的指標同時,需要指定該資料結構的長度

    3.send函數

    • 函數原型:int send(SOCKET s, const char *buf, int len, int flags);
    • 參數說明
      • SOCKET s:發送端通訊端描述符,用戶端的socket
      • const char *buf:應用程式要發送的資料的緩衝區(想要發送的資料),發送內容地址
      • int len:實際要發送的位元組數
      • int flags:發送方式標識,一般置為0即可
    • 傳回值
      • 如果成功,則返回傳送的位元組數,失敗則返回SOCKET_ERROR。
    • NSString *sendMsg = @"Hello";


      ssize_t sendLen = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);

      同步Socket的send函數的執行流程如下:

      • 調用該函數時,send先比較待發送資料的長度len與通訊端s的發送緩衝區的長度(區別於buf),如果len大於s的發送緩衝區的長度,則函數返回SOCKET_ERROR;如果len小於或者等於s發送緩衝區的長度,那麼send先檢查協議是否正在發送s的發送緩衝區中的資料:

      • a.如果是在發送,就等待協議將資料發送完畢。
      • b.如果沒有開始發送s的緩衝區中的資料,那麼send就比較s的發送緩衝區的剩餘空間和len的大小:

      • 如果len大於發送緩衝區剩餘空間大小(不足放入剩餘發送緩衝區),send就一直 等待協議把s發送緩衝區中的資料發送完;
      • 如果len小於發送緩衝區剩餘空間大小,就僅僅把buf中的資料copy到發送緩衝區的剩餘空間裡(send函數返回時並不代表send把s的緩衝區的資料(buf)傳到串連的另一端,而是協議傳輸的,send僅僅是把buf中的資料copy到s的發送緩衝區的剩餘空間中)。
      • 如果send函數copy資料成功,就返回實際copy的位元組數,如果send在copy資料時出現錯誤,那麼send就返回SOCKET_ERROR;如果send在等待協議傳送資料時斷開網路,那麼send函數也返回SOCKET_ERROR。

        要注意send函數把buf中的資料成功copy到s的發送緩衝的剩餘空間後就返回了,但是此時這些資料並不一定馬上被傳到串連的另一端。如果協議在後續的傳送過程中出現網路錯誤的話,那麼下一個Socket函數就會返回SOCKET_ERROR.(每一個除send之外的Socket函數在執行的最開始總要先等待通訊端的發送緩衝區中的資料被協議傳送完畢才能繼續,如果在等待時出現網路錯誤,那麼該Socket函數就返回SOCKET_ERROR)。

    4.recv函數

    • 函數原型:int recv (SOCKET s, char* buf ,int len, int flags);
    • 參數說明
      • SOCKET s:發送端通訊端描述符,用戶端的socket
      • const char *buf:應用程式存放接收資料的緩衝區
      • int len:buf的實際長度
      • int flags:接收方式標識,0表示阻塞,必須等待伺服器返回資料一般置為0即可
    • 傳回值
      • 如果成功,則返回接收到的位元組數。
    • uint8_t buffer[1024]; // 要把空間準備出來

      ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);

      同步Socket的recv函數的執行流程如下:
      調用recv函數時,recv先等待s的發送緩衝區中的資料被協議發送完畢:

    • a.如果協議在傳送s的發送緩衝區中的資料時出現網路錯誤,那麼recv函數返回SOCKET_ERROR;

    • b.如果s的發送緩衝區中的資料被協議成功發送完畢或者沒有資料時,recv先檢查通訊端s的接收緩衝區的情況:
    • 如果s接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢。當協議把資料接收完畢,recv函數就把s的接收緩衝區中的資料copy到buf中(注意協議接收到的資料可能大於buf的長度,所以在這種情況下要調用幾次recv函數才能把s的接收緩衝中的資料copy完。recv函數僅僅是copy資料,真正接收資料是協議來完成的),recv函數返回其實際copy的位元組數。
      如果recv在copy時出錯,那麼它返回SOCKET_ERROR;如果recv函數在等待協議接收資料時網路中斷了,那麼它返回0。

    5.close函數

    • 函數原型:int close(SOCKET s)
    • 參數說明
      • SOCKET s:發送端通訊端描述符,用戶端的socket
    • 傳回值
      • ???
    • close(clientSocket);

      相關名詞解釋:
      - 長串連:連上就一直聊!通常用於 QQ,即時通訊,效率高!
      - 短串連:通訊一次,馬上斷開,下一次再次建立串連,效率低!

  • Socket開發——Netcat

    $ nc -lk 12345

    Netcat:是終端下用於調試和檢查網路的工具包,可用於建立 TCP/IP 串連。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.