日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

初学Sockets编程(一) 基本的TCP套接字

發布時間:2024/1/3 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 初学Sockets编程(一) 基本的TCP套接字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  前段時間剛開始學習《TCP/IP Sockets編程(C語言實現) (第2版)》一書,又被告知建議先去看一下《UNIX網絡編程(第一卷)》的部分內容會對理解其理論知識有所幫助,于是稍微停滯了一下。幾天前所練習的實例已經有所生疏,因此為了復習這部分內容(前面所提起的第一本書第2章),此文便作為復習筆記(書本關鍵內容摘錄),而以后各章節的學習也希望能做到及時總結和復習。

  本章示例的工作方式:客戶連接服務器并發送它的數據;服務器簡單地把它接收到的任何內容發送回客戶并斷開連接。


1.典型的TCP客戶的通信步驟

⑴使用socket()創建TCP套接字

  參數涉及地址族、使用的協議,正確創建返回一個句柄。

⑵使用connect()建立到達服務器的連接

  參數涉及套接字句柄、服務器的地址結構中的地址和端口標識,其中地址結構需要強制轉換為泛型類型。

⑶使用send()和recv()通信

  send()參數涉及套接字句柄、發送內容、發送長度;返回值為發送的字節數,錯誤返回為-1。

  recv()參數涉及套接字句柄、接收緩沖區、緩沖區大小、調用方式;返回值為接受的字節數,返回0表示另一端應用程序關閉了TCP連接,返回-1表示失敗。

⑷使用close()關閉連接


示例為之前提供的下載頁面的TCPEchoClient4.c。


2.基本的TCP服務器通信的常規步驟

⑴使用socket()創建TCP套接字

⑵利用bind()給套接字分配端口號

參數涉及套接字句柄、服務器的本機地址結構中的地址和端口標識,其中地址結構需要強制轉換為泛型類型,如果不是非常關心所在地址可以用inaddr_any。

⑶使用listen()告訴系統允許對該端口建立連接

  參數涉及套接字句柄、最大允許連接數。

⑷反復執行以下操作

調用accept()為每個客戶連接獲取新的套接字

  參數涉及之前的套接字句柄,創建成功后即將填寫的本機地址結構,該地址結構的長度,其中地址結構需要強制轉換為泛型類型,返回一個新套接字的句柄。

使用send()和recv()通過新的套接字與客戶通信
使用close()關閉客戶連接


示例為之前提供的下載頁面的TCPEchoServer4.c以及TCPServerUtility.c中的HandleTCPClient()。


3.指定地址

⑴通用地址

struct sockaddr {
  sa_family_t sa_family; //Address family (e.g.,AF_INET)
  char sa_data[14];
};  

⑵IPv4地址

struct in_addr {
  uint32_t s_addr;
};

  struct sockaddr_in {
  sa_family_t sin_family;  //Internet protocol (AF_INET)
  in_port_t sin_port;    //Address port   (16bits)
  struct in_addr sin_addr; //IPv4 address    (32bits)
  char sin_zero[8];    //Not used
};

  ⑶IPv6地址(已按照上一篇文章更改)

struct in_addr {
  uint8_t s_addr[16];//Internet address(128bits)
};
struct sockaddr_in6 {
  sa_family_t sin6_family;  //Internet protocol(AF_INET6)
  in_port_t sin6_port;    //Address port(16bits)
  uint32_t sin6_flowinfo;  //Flow information
  struct in6_addr sin6_addr;//IPv6 address (128bits)
  uint32_t sin6_scope_id;  //Scope identifier
};

  ⑷地址轉換

int inet_pton(int addressFamily, constchar*src , void*dst)
//把地址從可打印的字符串(*src)轉換為數字(dst引用的地址)

constchar*inet_ntop(int addressFamily, constvoid*src, char*dst,socklen_t dstBytes)
//把地址從數字轉化為可打印的形式

  ⑸獲取套接字的關聯地址

int getpeername(int socket, struct sockaddr *remoteAddress, socklen_t (addressLength)
int getsockname(int socket, struct sockaddr (localAddress, socklen_t (addressLength)

  4.其他

  為了便于在同一臺計算機的終端上進行調試,需要先在后臺執行服務器程序(參數等所有內容的最后面加一個&),再執行客戶機程序,發送到127.0.0.1即可。相關調試時用到的進程操作還有ps(查看當前運行進程)、kill(關閉進程)。


作者:五岳

出處:http://www.cnblogs.com/wuyuegb2312

對于標題未標注為“轉載”的文章均為原創,其版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 

總結

以上是生活随笔為你收集整理的初学Sockets编程(一) 基本的TCP套接字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。