基本的TCP編程

int socket(int family,int type,int protocol);
family:
AF_INET ipv4協議
AF_INET6 ipv6協議
AF_LOCAL unix域協議
AF_ROUTE 路由套接口
 
type:
SOCK_STREAM 字節流套接口
SOCK_DGRAM 數據包套接口
SOCK_RAW 原始套接口
 
返回一個很小的非負整數,叫作套接口描述字,簡稱套接字sockfd
 
AF_XXX地址族
PF_XXX協議族
 
connect()創建一個TCP鏈接
 
三次握手出錯:
1 發送無應答,6秒後再次發送,無應答,24秒後再次發送,若75秒鐘後仍未相應,則返回錯誤
2 硬錯:SYN返回RST:SYN到達端口,但沒有監聽進程、TCP想取消一個已有的鏈接、TCP接受了一個根本不存在的鏈接
3 軟錯:中間路由器產生目的地不可達的ICMP錯誤
 
bind() 給套接口分配一個本地協議地址
 
struct sockaddr_in servaddr; servaddr.sin_addr.s_addr = htol(INADDR_ANY);
頭文件<netinet/in.h>定義的全部INADDR_常值都是主機字節序,因此應該使用htol
 
捆綁非通配IP地址的好處是:由內核將給定的目的IP地址解複用後送往服務器進程
 
int listen(int sockfd,int backlog);
listen()僅被TCP服務器使用:在調用socket bind以後,accept以前
1 將未鏈接的套接口轉換成被動套接口,指示內核應接受只想此套接口的鏈接請求。
2 函數第二個參數規定了,套接口排隊的最大鏈接個數
 
對於給定的監聽套接口,有兩個隊列:
1 未完成鏈接隊列 incomplete connection queue  SYN_RCVD狀態
2 已完成鏈接隊列 complete connection queue ESTABLISHED狀態
 
accept() TCP服務器調用,從已完成的隊列頭返回下一個已完成的鏈接。若完成隊列爲空,則睡眠
 
int accept(int sockfd,struct sockaddr *cliaddr,socklen_t * addrlen);
addrlen是值-結果參數
 
fork()一次調用兩個返回值:
1 父進程調用返回的是子進程的ID
2 子進程調用返回0
 
close()將套接口設置爲已關閉標記,並當即返回到進程。
 
描述字訪問計數,用於設置父進程的訪問情況。
相關文章
相關標籤/搜索