????????基本特征:socket是一種接口技術(shù),被抽象了一種文件操作,可以讓同一計算機中的不同進程之間通信,也可以讓不同計算機中的進程之間通信(網(wǎng)絡通信)
? ? 本地進程間通信編程模型:
? ? ? ? 進程A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????? 進程B
? ? 創(chuàng)建socket對象 ? ? ? ? ? ? ? ? ?????????????????? 創(chuàng)建socket對象
? ? 準備通信地址(本地socket文件) ? ? ???????準備通信地址
? ? 綁定sokect對象和地址 ? ? ? ? ? ??????????????? ...
? ? 監(jiān)聽 ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????? ? ? ? ?...????????????????
? ? 等待連接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連接
? ? 接收\發(fā)送數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?發(fā)送\接收數(shù)據(jù)
? ? 關(guān)閉socket ? ? ? ? ? ? ? ? ? ?????????????????? ? ? ? 關(guān)閉socket
? ? 刪除socket文件
? ?
? ? 注意:底層需要借助socket文件,才能進行同一計算機不同進程的通信
? ? 注意:每一步驟的返回值一定要判斷 否則不知道是哪一步出問題
創(chuàng)建socket對象
int socket(int domain, int type, int protocol);
? ? 功能:創(chuàng)建socket對象
? ? domain:
? ? ? ? AF_UNIX/AF_LOCAL ? 本地通信,進程間通信
? ? ? ? AF_INET ? ? ? ? ? ?基于IPv4地址通信
? ? ? ? AF_INET6 ? ? ? ? ? 基于IPv6地址通信
? ? type:
? ? ? ? SOCK_STREAM ? ? 數(shù)據(jù)流協(xié)議 //TCP
? ? ? ? SOCK_DGRAM ? ? ?數(shù)據(jù)報協(xié)議 //UDP
? ? protocol:
? ? ? ? 特殊通信協(xié)議,一般不用,寫0即可
? ? 返回值:成功返回socket描述符,失敗返回-1 ?
綁定socket和通信地址
?int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
? ? ?功能:綁定socket和通信地址(文件路徑\網(wǎng)絡地址)
? ? ?sockfd:socket描述符
? ? ?addr:通信地址結(jié)構(gòu)體
? ? ? ? 實際使用傳遞的地址結(jié)構(gòu)體 sockaddr_un或者sockaddr_in,但是傳參時要把它們轉(zhuǎn)換成sockaddr,因為C語言沒有自建類型的自動類型識別,因此要強轉(zhuǎn) //C++有自動類型識別轉(zhuǎn)換
? ? ? ? //本地通信使用
? ? ? ? #include <sys/un.h>
? ? ? ? struct sockaddr_un {
? ? ? ? ? ? __kernel_sa_family_t sun_family; // 地址簇domain寫啥它寫啥
? ? ? ? ? ? char sun_path[UNIX_PATH_MAX]; ? // socket文件路徑 (文件路徑給新的 ?會自動幫你創(chuàng)建文件)
? ? ? ? };
? ? ? ? // ?網(wǎng)絡通信時使用
? ? ? ? #include <netinet/in.h>
? ? ? ? struct sockaddr_in {
? ? ? ? __kernel_sa_family_t ?sin_family; //地址簇domain寫啥它寫啥
? ? ? ? __be16 ? ? ? ?sin_port; ? // 端口號
? ? ? ? struct in_addr ? ?sin_addr; ? // IP地址結(jié)構(gòu)體
? ? ? ? };
? ? ? ? struct in_addr {
? ? ? ? ? ? __be32 ?s_addr; ? ? // ?IP地址數(shù)據(jù)
? ? ? ? };
? ? addrlen:地址結(jié)構(gòu)體的字節(jié)數(shù),用于區(qū)分是sockaddr_in還是sockaddr_un
? ? 返回值:成功0 失敗-1
監(jiān)聽綁定好的socket
int listen(int sockfd, int backlog);
? ? 功能:監(jiān)聽已經(jīng)綁定好的socket
? ? sockfd:socket描述符
? ? backlog:監(jiān)聽等待連接的排隊數(shù)量 默認最大128
? ? //等待連接有個排隊隊列 ?backlog是指隊列滿了之后還可以額外排隊的數(shù)量 隨便寫5
? ? 返回值:成功0 失敗-1 ?//監(jiān)聽成功才能等待連接
等待連接
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
? ? 功能:等待連接
? ? sockfd:socket描述符
? ? addr:獲取連接者的地址,不想獲取可以給NULL ? //本地連接基本不用獲取
? ? addrlen:獲取連接者的通信地址結(jié)構(gòu)體字節(jié)數(shù),不想獲取可以給NULL
? ? 返回值:成功返回一個針對該連接的新的socket描述符,失敗返回-1 //接下去通信需要用這個新的socket描述符
? ? 注意:
? ? ? ? 1、如果沒有連接,那么該函數(shù)會阻塞等待
? ? ? ? 2、如果要獲取連接者的地址,后面兩個參數(shù)都需要傳遞
? ? ? ? 3、addrlen要獲取時,先要給addrlen傳遞addr的字節(jié)數(shù),才能獲取連接者的ip
連接
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
? ? 功能:連接socket
? ? sockfd:socket描述符
? ? addr:目標地址 ?//建立連接
? ? addrlen:目標地址結(jié)構(gòu)體的字節(jié)數(shù)
? ? 返回值:成功0 失敗-1
發(fā)送數(shù)據(jù)
ssize_t send(int sockfd,const void *buf,size_t len,int flags);
? ? 功能:向建立連接之后的socket發(fā)送數(shù)據(jù),數(shù)據(jù)流通信使用
? ? sockfd:建立連接之后socket描述符
? ? buf:待發(fā)送的數(shù)據(jù)內(nèi)存首地址
? ? len:要發(fā)送的字節(jié)數(shù)
? ? flags:一般寫0阻塞發(fā)送即可
? ? ? ? MSG_DONTWAIT 不阻塞
? ? ? ? MSG_OOB ? ? ?優(yōu)先緊急數(shù)據(jù)
? ? 返回值:成功發(fā)送的字節(jié)數(shù),出錯返回-1 //連接斷開了就可能發(fā)送失敗
接收數(shù)據(jù)
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
? ? 功能:從建立連接的socket中接收數(shù)據(jù),數(shù)據(jù)流通信使用
? ? sockfd:建立連接之后socket描述符
? ? buf:存儲接收的數(shù)據(jù)的內(nèi)存首地址
? ? len:buf的字節(jié)數(shù)
? ? flags:一般寫0阻塞接收即可
? ? ? ? MSG_DONTWAIT 不阻塞
? ? 返回值:成功接收到的字節(jié)數(shù),-1出現(xiàn)錯誤,正常斷開返回0
關(guān)閉socket
? ? close(fd)
? ? 功能:關(guān)閉socket //一切皆文件 關(guān)閉新的那個socket 斷開連接
? ?
? ? 192.168.122.4 ? 192.168.122.5 ? ip地址
? ? 255.255.255.0 ? 子網(wǎng)掩碼
? ? 192.168.122.0 ? 網(wǎng)絡地址文章來源:http://www.zghlxwxcb.cn/news/detail-685351.html
? ? 192.168.122.4/24 ?(24個1)相當于&255.255.255.0文章來源地址http://www.zghlxwxcb.cn/news/detail-685351.html
到了這里,關(guān)于網(wǎng)絡編程day1——進程間通信-socket套接字的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!