socket網路通訊的建立

2021-08-19 14:18:06 字數 1772 閱讀 3317

在網路程式設計中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函...