在網路程式設計中socket通常被翻譯為」套接字」,在linux作業系統下,一切皆檔案,所以套接字也稱為一種檔案描述符。
a)建立socket檔案描述符
#include /* see notes */
#include
int socket(int domain, int type, int protocol); //成功返回檔案描述符,失敗返回-1
引數介紹:
domain:協議族的名字,如af_inet為ipv4
type:通訊型別,sock_stream(流通信),sock_dgram(資料段)
protocol:通常設為0
b)繫結ip
#include /* see notes */
#include
int bind(int sockfd, const
struct sockaddr *addr,socklen_t addrlen);
//繫結的檔案描述符 繫結的套接字位址 位址的長度
//成功返回0,失敗返回-1
備註:因為不同的協議族可以有不同的位址型別,所以通過指定乙個公共結構體,強轉換成該結構體的位址,並告訴該位址的長度。
c)客戶端的連線過程
#include /* see notes */
#include
int connect(int sockfd, const
struct sockaddr *addr, socklen_t addrlen);
//成功返回0,失敗返回-1
connect的作用是用指定的套接字去連線指定的位址,對於面向連線的的協議,connect只能成功一次,因為已經建立連線了,對於非面向連線的協議(套接字型別為sock_dgram),可執行多次connect,以位這時的connect僅僅是設定了預設的目的位址。
對於tcp協議來說,connect實際上是要真正地進行三次握手,所以其預設是乙個阻塞的操作。
d)服務端的連線過程
listen的使用
#include /* see notes */
#include
int listen(int sockfd, int backlog); //指定的檔案描述符 監聽的長度
//成功返回0,失敗返回-1
讓伺服器處於監聽狀態
accept的使用
用於從指定的套接字連線佇列中取出第乙個連線,並返回乙個新的套接字與客戶端通訊,沒有則阻塞。
#include /* see notes */
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//處於監聽狀態的檔案描述符,儲存對端的位址資訊
tcp的連線過程(三次握手)
當客戶端收到伺服器端傳送的syn包後返回乙個ack應答,客戶端進入established狀態,服務端收到ack應答後,服務端進入established狀態,此時連線建立完成。
Socket網路通訊
服務端的程式如下 1.建立乙個伺服器端socket,即serversocket,指定繫結的埠,並監聽此埠8888 serversocket serversocket new serversocket 8888 socket socket null 記錄客戶端的數量 int count 0 syste...
socket網路通訊
read write recv send readv writev recvmsg sendmsg recvfrom sendto include ssize t read int fd,void buf,size t count ssize t write int fd,const void bu...
socket網路通訊《二》
socket網路通訊 本文注意基於socket來分析tcp連線建立過程。先回顧一下tcp連線建立過程 主機a執行的是tcp客戶端程式,主機b執行的是tcp伺服器程式,最初兩端tcp程序處於closed態,a主動開啟連線,對應客戶端connect函式發起連線,b被動接受連線,對應於伺服器listen函...