初学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套接字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 掌上生活积分兑换爱奇艺会员怎么用
- 下一篇: 微内核架构(Microkernel Ar