日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX 网络编程 chapter 4

發(fā)布時間:2025/3/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX 网络编程 chapter 4 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本TCP套接字編程

4.2 socket 函數(shù)

// 創(chuàng)建套接字文件描述符 #include <socket/socket.h> //返回:若成功則返回非負(fù)描述符,出錯則為-1 int socket(int family, int type, int protocol); //example : socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

4.3 connect 函數(shù)

#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);

TCP套接字
1. 調(diào)用connect會激發(fā)TCP的“三次握手”
2. 若TCP客戶沒有收到SYN分節(jié)的響應(yīng), 返回ETIMEDOUT錯誤。
3. 客戶發(fā)送SYN分節(jié)后,收到RST響應(yīng),表明在指定的端口上沒有進(jìn)程在等待與之連接, 返回ECONNREFUSES錯誤。
4. 若客戶發(fā)送的SYN在中間某個路由器上引起了一個"destination unreachable"ICMP錯誤. 返回EHOSTUNREACH 或 ENETUNTREACH錯誤
5.調(diào)用connect失敗后,都必須調(diào)用close函數(shù)關(guān)閉當(dāng)前的套接字,如要再次調(diào)用connect函數(shù),必須先重新調(diào)用socket函數(shù)

產(chǎn)生RST的三個條件:
目的地為某端口的SYN到達(dá),然而該端口上沒有正在監(jiān)聽的服務(wù)器;
TCP想取消一個已有連接;
TCP接收到一個根本不存在的連接上的分節(jié)。

4.4 bind 函數(shù)

int bind(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); // 成功返回0,出錯返回-1//IPv4 通配地址 struct sockaddr_in servaddr; servaddr.sin_addr.s_addr = htonl (INADDR_ANY); //IPv6 通配地址 struct sockaddr_in6 servaddr6; servaddr.sin6_addr= in6addr_any;

進(jìn)程綁定非通配IP地址到套接字上的常見例子是為多個組織提供web服務(wù)器的主機上(unp/v3/P83 挺有意思)
bind函數(shù)返回的常見錯誤是EADDRINUSE:地址已經(jīng)被使用

4.5 listen 函數(shù)

int listen (int sockfd, int backlog) //成功:返回0,出錯則返回-1

backlog: 內(nèi)核應(yīng)該為相應(yīng)套接字排隊的最大連接個數(shù)
內(nèi)核為每個監(jiān)聽的套接字維護(hù)兩個隊列:

未完成連接隊列:
由某個客戶端發(fā)出并到達(dá)服務(wù)器,而服務(wù)器正在等待完成相應(yīng)的TCP三路握手過程,這些套接字處于SYN_RCD狀態(tài)
已完成連接隊列:
每個已完成三次握手過程的客戶對應(yīng)其中一項。這些套接字處于ESTABLISHED狀態(tài)。

未完成連接隊列的個數(shù)+已完成連接隊列的個數(shù)不超過backlog

4.10 getpeername 和 getsockname

getsockname返回與某個套接字關(guān)聯(lián)的本地協(xié)議地址,getpeername返回與某個套接字關(guān)聯(lián)的外地協(xié)議地址。

struct sockaddr_in cltaddr;socklen_t len = sizeof (cltaddr);if (getsockname(sockfd, (struct sockaddr*)(&cltaddr), &len) < 0){err_sys("getsockname err."); }

總結(jié)

以上是生活随笔為你收集整理的UNIX 网络编程 chapter 4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。