#include int socket(int family, int type, int protocal);//若成功則返回非負描述符,若失敗則返回-1
socket函式成功時返回的為套接字描述符(socket descriptor,簡稱sockfd)
socket函式的family常值:
socket函式的type常值:
socket函式的protocol常值:
family和type的有效組合(標記為是的也是有效組合,但沒有找到合適的縮略詞)
tcp客戶用connect函式來建立與tcp伺服器的連線,如果是tcp套接字,呼叫connect函式將引發三次握手過程,並且僅在連線成功或者出錯時才返回。
#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
bind函式把乙個本地協議位址賦予乙個套接字,對於網際網協議,協議位址是32位的ipv4位址或128位的ipv6位址與16位的tcp或udp埠號的組合。呼叫bind函式可以指定ip位址或者埠號,可以兩者都指定,也可兩者都不指定。
#include int bind(int sockfd, const struct sockaddr * servaddr, socklen_t addrlen); //成功則返回0,出錯則返回-1
5. listen函式
僅由tcp伺服器呼叫,將乙個未連線的套接字轉換成乙個被動套接字,指示核心應接受指向該套接字的連線請求。
#include //backlog規定應為相應套接字排隊的最大連線個數
int listen(int sockfd, int backlog);//若成功則返回0,出錯則返回-1
核心為任何乙個監聽套接字維護兩個佇列:未完成連線佇列(還沒有完成三次握手)和已完成連線佇列。兩佇列之和不超過backlog
6. accept函式
由tcp伺服器呼叫,用於從已完成連線佇列隊頭返回乙個已完成連線,如果已完成連線為空,那麼程序被投入睡眠。
#include//sockfd為監聽套接字描述符,若accept成功,返回的是已連線套接字描述符
//cliaddr和addrlen用來返回已連線的對端程序(客戶)的協議位址及該位址的長度,如果對返回客戶位址不感興趣,可以將這兩個指標置為空指標
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);//若成功則返回非負描述符(已連線套接字描述符),若失敗則返回-1
7. fork和exec函式
fork函式是unix派生新程序的唯一方法。
#include pid_t fork(void); //呼叫fork函式一次,返回兩次,在父程序中返回新派生程序的程序id,在子程序中返回0。若出錯返回-1。
父程序和子程序:
fork函式的兩種用法:
exec函式:有6個
8. close函式
close函式用來關閉套接字,並終止tcp連線
#include int close(int sockfd);//若成功則返回0,出錯則返回-1
9. getsockname和getpeername函式
返回與某個套接字關聯的本地協議位址、外地協議位址。
#include //成功則返回0,出錯則返回-1
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t * addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t * addrlen);
UNIX網路程式設計 基本TCP套接字程式設計
一 基於tcp協議的網路程式 下圖是基於tcp協議的客戶端 伺服器程式的一般流程 伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn ...
UNIX網路程式設計卷一 3 套接字程式設計簡介
1 套接字位址結構 ipv4套接字位址結構 struct in addr struct sockaddr in 2 通用套接字位址結構 struct sockaddr 3 值 結果引數 4 位元組序排序函式 另一種方法是將高序位元組儲存在起始位址,這稱為大端位元組序。include uint32 t...
基本TCP套介面的程式設計流程
要實現客戶端和伺服器端的通訊,則需要客戶端和伺服器端共同完成。其中,tcp伺服器和客戶端的程式設計流程如圖所示 首先由伺服器端建立socket,然後bind繫結通訊埠,建立listen監聽佇列。之後便開始了通訊的過程。此時伺服器阻塞在accept這裡,直到tcp客戶端主動進行connect進行三次握...