版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第12章網(wǎng)絡(luò)編程內(nèi)容提要網(wǎng)絡(luò)編程概述互聯(lián)網(wǎng)傳輸協(xié)議
Socket上的讀寫(xiě)操作
Unix域套接字套接字選項(xiàng)構(gòu)建并發(fā)服務(wù)器12.1網(wǎng)絡(luò)編程概述網(wǎng)絡(luò)套接字Socket
TCP/IP誕生于4.4BSD,隨著TCP/IP在互聯(lián)網(wǎng)的廣泛應(yīng)用,編程接口BSDsocket也事實(shí)上成為網(wǎng)絡(luò)接口標(biāo)準(zhǔn)。目前,已被包括Linux在內(nèi)的眾多操作系統(tǒng)支持。
BSDsocket為一種通用網(wǎng)絡(luò)編程接口,支持豐富的網(wǎng)絡(luò)協(xié)議,例如,ipx/spx等。系統(tǒng)調(diào)用接口層VFS接口層Socket抽象層EthernetTokenRingPPPSLIP網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)接口層PF_INETPF_PACKETPF_IPXPF_UNIXiptcpudp設(shè)備驅(qū)動(dòng)層協(xié)議層接口層SOCK_DGRAMSOCK_RAWSOCK_RAWSOCK_DGRAMSOCK_STREAMreadwriteclosesocketrecvsendLinux內(nèi)核支持的協(xié)議客戶(hù)機(jī)/服務(wù)器模型socket采用客戶(hù)機(jī)/服務(wù)器模式,服務(wù)器監(jiān)聽(tīng)客戶(hù)機(jī)發(fā)送的連接請(qǐng)求,客戶(hù)機(jī)需預(yù)先獲知服務(wù)器的地址,雙方連接建立后,可實(shí)現(xiàn)雙向數(shù)據(jù)傳輸。
傳輸層通常提供兩種類(lèi)型的傳輸服務(wù),面向連接的傳輸服務(wù)和無(wú)連接的傳輸服務(wù),對(duì)于面向連接的傳輸服務(wù),可確保雙方傳輸數(shù)據(jù)的有序和可靠。對(duì)于無(wú)連接的傳輸協(xié)議,無(wú)須建立連接,可直接根據(jù)對(duì)方地址收發(fā)數(shù)據(jù)。4TCP/IP協(xié)議TCP/IP作為互聯(lián)網(wǎng)的標(biāo)準(zhǔn)協(xié)議族,其傳輸層為上層提供TCP和UDP兩種服務(wù)。
TCP是一種面向連接的傳輸協(xié)議,通信雙方以字節(jié)流方式可靠地交換數(shù)據(jù),用戶(hù)無(wú)需關(guān)心內(nèi)部復(fù)雜的協(xié)商邏輯,但TCP也會(huì)消耗一定的帶寬資源。
UDP是一種無(wú)連接的數(shù)據(jù)報(bào)協(xié)議,以數(shù)據(jù)報(bào)為單位,數(shù)據(jù)報(bào)在傳輸過(guò)程中可能丟失和失序,UDP消耗相對(duì)較少的帶寬資源。應(yīng)用編程接口分類(lèi)API功能描述socketAPIsocket創(chuàng)建套接字bind綁定地址listen監(jiān)聽(tīng)綁定地址上的連接請(qǐng)求accept接收來(lái)自綁定地址上的連接請(qǐng)求connect向服務(wù)器發(fā)起連接請(qǐng)求recv/recvfrom/recvmsg接收數(shù)據(jù)send/sendto/sendmsg發(fā)送數(shù)據(jù)close/shutdown關(guān)閉/優(yōu)雅關(guān)閉sendfile在內(nèi)核空間傳輸文件socketpair創(chuàng)建互聯(lián)套接字getsockopt/setsockopt獲取/設(shè)置套接字選項(xiàng)12.2互聯(lián)網(wǎng)傳輸協(xié)議內(nèi)容提要面向連接的傳輸協(xié)議TCPsocket編程接口無(wú)連接的傳輸協(xié)議UDP面向連接的傳輸協(xié)議TCPTCP是一種面向連接基于字節(jié)流的可靠傳輸協(xié)議,確保通信雙方數(shù)據(jù)傳輸?shù)挠行蚝驼_。采用客戶(hù)機(jī)/服務(wù)器模式,服務(wù)器監(jiān)聽(tīng)客戶(hù)機(jī)發(fā)起的連接請(qǐng)求,在雙方建立連接后,便可進(jìn)行數(shù)據(jù)傳輸?;赥CP的客戶(hù)機(jī)/服務(wù)器模式服務(wù)器端請(qǐng)求數(shù)據(jù)socket()bind()listen()accept()socket()connect()send()recv()客戶(hù)端(Blockuntilconnection)建立連接recv()send()回復(fù)數(shù)據(jù)close()關(guān)閉連接recv()close()創(chuàng)建套接字1.socket函數(shù)頭文件
#include<sys/types.h> #include<sys/socket.h>函數(shù)原型
int
socket(intdomain,inttype,intprotocol);功能 創(chuàng)建套接字。參數(shù)
domain:協(xié)議族。
type:協(xié)議類(lèi)型。
protocol:默認(rèn)為0,通常用于原始套接字選項(xiàng)。返回值 成功:套接字的文件描述符,錯(cuò)誤:返回-1。創(chuàng)建套接字(續(xù))參數(shù)domain描述AF_UNIX本地通信協(xié)議AF_INETIPv4互聯(lián)網(wǎng)協(xié)議AF_INET6IPv6互聯(lián)網(wǎng)協(xié)議AF_IPXIPXnovellprotocolsAF_NETLINK配置協(xié)議參數(shù)type描述SOCK_STREAM面向連接的字節(jié)流服務(wù)SOCK_DGRAM無(wú)連接不可靠數(shù)據(jù)報(bào)服務(wù)SOCK_RAW底層協(xié)議訪問(wèn)服務(wù)socket函數(shù)中參數(shù)type的定義函數(shù)中參數(shù)domain的定義綁定地址頭文件
#include<sys/types.h> #include<sys/socket.h>函數(shù)原型
int
bind(int
sockfd,struct
sockaddr*addr,socklen_t
addrlen);功能 綁定本地地址。參數(shù)
sockfd:套接字的文件描述符。
addr:ip地址。
addrlen:地址長(zhǎng)度。返回值 成功返回0,錯(cuò)誤:返回-1。綁定地址(續(xù))sockaddr使用更一般的類(lèi)型,其定義如下。
struct
sockaddr{
sa_family_t
sa_family;//協(xié)議族
charsa_data[14];//內(nèi)容與協(xié)議族有關(guān)
}TCP/IP協(xié)議族的地址類(lèi)型有ipv4和ipv兩種,下面僅以ipv4未例,其地址類(lèi)型sockaddr_in的定義如下。struct
sockaddr_in{shortint
sin_family;//取值為AF_INETunsignedshortint
sin_port;//端口號(hào)struct
in_addr
sin_addr;//IP地址...};監(jiān)聽(tīng)套接字頭文件
#include<sys/socket.h>函數(shù)原型
int
listen(int
sockfd,intbacklog);功能 監(jiān)聽(tīng)套接字上的連接請(qǐng)求。參數(shù)
sockfd:套接字的文件描述符。
backlog:可容納連接請(qǐng)求的數(shù)量。返回值 成功返回0,錯(cuò)誤返回-1。接收連接頭文件
#include<sys/types.h> #include<sys/socket.h>函數(shù)原型
int
accept(int
sockfd,struct
sockaddr*addr,socklen_t*addrlen);功能 接收連接。參數(shù)
sockfd:套接字的文件描述符。
addr:連接請(qǐng)求的地址。
addrlen:地址長(zhǎng)度。返回值 成功返回為新連接創(chuàng)建的套接字,失敗返回-1。發(fā)起連接請(qǐng)求頭文件
#include<sys/types.h> #include<sys/socket.h>函數(shù)原型
int
connect(int
sockfd,struct
sockaddr*addr,socklen_t
addrlen);功能 向服務(wù)器發(fā)起連接請(qǐng)求。參數(shù)
sockfd:套接字的文件描述符。
addr:服務(wù)器地址。
addrlen:地址長(zhǎng)度。返回值 成功返回0,錯(cuò)誤返回-1。接收數(shù)據(jù)頭文件
#include<sys/types.h> #include<sys/socket.h>函數(shù)原型
ssize_t
recv(int
sockfd,void*buf,size_t
len,intflags);
ssize_t
recvfrom(int
sockfd,void*buf,size_t
len,int
flags,struct
sockaddr*from,socklen_t*addrlen);
ssize_t
recvmsg(int
sockfd,struct
msghdr*msg,intflags);功能 從套接字接收數(shù)據(jù)。參數(shù)
sockfd:套接字的文件描述符。buff:緩沖區(qū)地址。
len:緩沖區(qū)大小。from:目標(biāo)地址。addrlen:地址長(zhǎng)度。
msg:接收請(qǐng)求地址。flags:選項(xiàng)。返回值 成功返回接收的字節(jié)數(shù),失敗返回-1。接收數(shù)據(jù)recv(sockfd,buf,len,flags);等價(jià)于:recvfrom(sockfd,buf,len,flags,NULL,NULL);。msg
為msghdr類(lèi)型指針,可使函數(shù)參數(shù)最小化,msghdr類(lèi)型封裝了接收數(shù)據(jù)所需的參數(shù),其定義如下。struct
msghdr{void*msg_name;//目標(biāo)地址
socklen_t
msg_namelen;//目標(biāo)地址長(zhǎng)度
struct
iovec*msg_iov;//緩沖區(qū)
size_t
msg_iovlen;//緩沖區(qū)數(shù)量
void*msg_control;//附加數(shù)據(jù)地址
size_t
msg_controllen;//附加數(shù)據(jù)長(zhǎng)度
int
msg_flags;//用于接收數(shù)據(jù)};發(fā)送數(shù)據(jù)頭文件 #include<sys/types.h> #include<sys/socket.h>函數(shù)原型
ssize_t
send(int
sockfd,constvoid*buf,size_t
len,intflags);
ssize_t
sendto(int
sockfd,constvoid*buf,size_t
len,int
flags,const
struct
sockaddr*to,socklen_t
addrlen);
ssize_t
sendmsg(int
sockfd,conststruct
msghdr*msg,intflags);功能
向套接字發(fā)送數(shù)據(jù)。參數(shù)
sockfd:套接字的文件描述符uff:緩沖區(qū)地址。
len:緩沖區(qū)大小。to:目標(biāo)地址。addrlen:地址長(zhǎng)度。
msg:發(fā)送請(qǐng)求。flags:選項(xiàng)。返回值 成功返回發(fā)送的字節(jié)數(shù),失敗返回-1。關(guān)閉連接頭文件
#include<unistd.h> #include<sys/socket.h>函數(shù)原型
int
close(int
sockfd);
int
shutdown(int
sockfd,inthow);功能 關(guān)閉/優(yōu)雅關(guān)閉連接。參數(shù)
sockfd:套接字的文件描述符。
how:關(guān)閉的方式。返回值 成功返回0,失敗返回-1。關(guān)閉連接
無(wú)須傳輸數(shù)據(jù)時(shí),應(yīng)關(guān)閉連接,當(dāng)向已關(guān)閉的套接字發(fā)送數(shù)據(jù)時(shí),將導(dǎo)致失敗。當(dāng)調(diào)用close函數(shù)關(guān)閉連接時(shí),若套接字的內(nèi)核發(fā)送緩沖尚有未發(fā)送的數(shù)據(jù),close會(huì)一直等待,直至數(shù)據(jù)全部發(fā)送完成或超時(shí)。并非所有發(fā)生異常的一方都產(chǎn)生RST包,需通過(guò)其他手段獲知對(duì)方的狀態(tài)。優(yōu)雅關(guān)閉close函數(shù)會(huì)將收發(fā)兩條通道全部關(guān)閉,后續(xù)無(wú)法接收數(shù)據(jù);若使用shutdown函數(shù),可僅關(guān)閉寫(xiě)通道,但仍可繼續(xù)接收數(shù)據(jù),故稱(chēng)為優(yōu)雅關(guān)閉。收到FIN包的一方返回0,僅表示對(duì)方已關(guān)閉了寫(xiě)操作,無(wú)法確定對(duì)方是否關(guān)閉了讀操作。無(wú)連接的傳輸協(xié)議UDPUDP為無(wú)連接的傳輸協(xié)議,無(wú)法保證將數(shù)據(jù)有序且正確地送達(dá)對(duì)方,但并不意味著丟報(bào)現(xiàn)象的頻繁發(fā)生,這取決于整個(gè)網(wǎng)絡(luò)的狀態(tài)。在局域網(wǎng)環(huán)境下,通常有很高的可靠性。相較于TCP,UDP消耗較少的帶寬資源,具有較高的傳輸效率。
UDP在很多應(yīng)用場(chǎng)景得到了廣泛應(yīng)用,例如,流媒體和網(wǎng)絡(luò)電話等。3基于UDP的客戶(hù)機(jī)/服務(wù)器模式請(qǐng)求數(shù)據(jù)socket()bind()recvfrom()服務(wù)器端socket()sendto()recvfrom()客戶(hù)機(jī)端(Blockuntilreceivedatagram)sendto()回復(fù)數(shù)據(jù)close()12.3Socket上的讀寫(xiě)操作內(nèi)容提要socket支持文件I/O接口面向連接的I/O操作socket的異步驅(qū)動(dòng)模式零拷貝技術(shù)字節(jié)序和字節(jié)對(duì)齊socket支持文件I/O接口
內(nèi)核為socket提供了文件I/O接口的支持,對(duì)于新建套接字時(shí)返回的套接字描述符,也適用于文件的I/O操作,例如,read/write函數(shù)和select/poll函數(shù)等。由于標(biāo)準(zhǔn)I/O函數(shù)庫(kù)建立在基本文件I/O基礎(chǔ)上,因此,標(biāo)準(zhǔn)I/O函數(shù)庫(kù)中的函數(shù)也適用于套接字,例如,fgets和fputs函數(shù)等,由于在用戶(hù)空間設(shè)置了緩沖區(qū),從而會(huì)給I/O讀寫(xiě)操作帶來(lái)一定的影響。面向連接的I/O操作
由于面向連接套接字的字節(jié)流特性,數(shù)據(jù)的流速取決于雙方套接字內(nèi)核緩沖區(qū)滑動(dòng)窗口狀態(tài)的變化,無(wú)論采用阻塞或非阻塞模式,在讀寫(xiě)套接字時(shí),未必能將指定大小的數(shù)據(jù)一次性操作成功。面向連接的讀操作
對(duì)于讀操作,造成無(wú)法一次性全部讀取所需數(shù)據(jù)的因素如下。1.所需的數(shù)據(jù)未全部到達(dá)內(nèi)核接收緩沖區(qū)。2.即使全部到達(dá),在讀取過(guò)程也可能被信號(hào)中斷。面向連接的寫(xiě)操作
對(duì)于寫(xiě)操作,造成無(wú)法一次性全部寫(xiě)入指定數(shù)據(jù)的因素如下。1.寫(xiě)入過(guò)程被信號(hào)中斷。2.在非阻塞模式下,套接字的內(nèi)核發(fā)送緩沖區(qū)僅能容納部分待寫(xiě)入的數(shù)據(jù)。一次性讀特定大小的數(shù)據(jù)ssize_t
readn(int
fd,void*buffer,size_tn){
ssize_t
numRead;
size_t
totRead; char*buf;
buf=buffer; for(totRead=0;totRead<n;){
numRead=read(fd,buf,n-totRead); if(numRead==0) returntotRead; if((numRead==-1)&&(errno==EINTR)) continue; else return-1;
totRead+=numRead;
buf+=numRead; } returntotRead;}一次性寫(xiě)入特定大小的數(shù)據(jù)ssize_t
writen(int
fd,constvoid*buffer,size_tn){
ssize_t
numWritten;
size_t
totWritten; constchar*buf;
buf=buffer; for(totWritten=0;totWritten<n;){
numWritten=write(fd,buf,n-totWritten);if(numWritten<=0){ if(numWritten==-1&&errno==EINTR) continue; else return-1; }
totWritten+=numWritten;
buf+=numWritten; } returntotWritten;}socket的異步I/O模式
對(duì)處于非阻塞模式的套接字,為了獲知套接字狀態(tài)的變化,內(nèi)核提供了兩種異步I/O驅(qū)動(dòng)模式。異步I/O事件驅(qū)動(dòng)2.異步I/O信號(hào)驅(qū)動(dòng)。異步I/O事件驅(qū)動(dòng)
內(nèi)核將套接字狀態(tài)的改變抽象為I/O事件,例如,套接字上有新數(shù)據(jù)到達(dá)和發(fā)送緩沖區(qū)重新變得可用等,用戶(hù)可通過(guò)select/poll/epoll監(jiān)聽(tīng)套接字狀態(tài)的變化,利用獲取的I/O事件判斷狀態(tài)改變的原因,從而進(jìn)行相應(yīng)的處理,事件類(lèi)型I/O事件I/O事件的描述readPOLLIN有數(shù)據(jù)到達(dá)readPOLLIN面向連接的請(qǐng)求到達(dá)readPOLLHUP對(duì)方關(guān)閉了連接readPOLLHUP向失效的套接字上寫(xiě)數(shù)據(jù),同時(shí)發(fā)送SIGPIPE信號(hào)WritePOLLOUT發(fā)送緩沖區(qū)變得可用Read/WritePOLLIN|POLLOUT連接完成Read/WritePOLLERR發(fā)生了異步I/O錯(cuò)誤Read/WritePOLLHUP對(duì)方關(guān)閉了一個(gè)方向上的通道ExceptionPOLLPRI緊急數(shù)據(jù)到達(dá),同時(shí)發(fā)送SIGURG信號(hào)異步I/O信號(hào)驅(qū)動(dòng)
若利用fcntl函數(shù)在套接字上設(shè)置了O_ASYNC標(biāo)識(shí),套接字則被設(shè)置為I/O信號(hào)驅(qū)動(dòng)模式,當(dāng)套接字的狀態(tài)發(fā)生改變,內(nèi)核會(huì)向指定的進(jìn)程發(fā)送SIGIO信號(hào)或自定義的實(shí)時(shí)信號(hào)。當(dāng)存在多個(gè)狀態(tài)發(fā)生改變的套接字,信號(hào)處理程序可根據(jù)信號(hào)來(lái)源加以區(qū)分。零拷貝技術(shù)
對(duì)于某些應(yīng)用,在數(shù)據(jù)傳輸時(shí),需頻繁在用戶(hù)空間和內(nèi)核空間復(fù)制數(shù)據(jù),例如,web和ftp等。為了降低帶來(lái)的系統(tǒng)開(kāi)銷(xiāo),內(nèi)核引入了稱(chēng)為零拷貝的技術(shù),直接在內(nèi)核完成數(shù)據(jù)復(fù)制,繞過(guò)了用戶(hù)緩沖區(qū),減少了數(shù)據(jù)拷貝次數(shù)。零拷貝接口函數(shù)sendfile函數(shù)頭文件
#include<sys/sendfile.h>函數(shù)原型
ssize_t
sendfile(int
out_fd,int
in_fd,off_t*offset,size_tcount);功能 在內(nèi)核空間傳輸文件。參數(shù)
out_fd:目標(biāo)套接字的文件描述符。
in_fd:源文件描述符。
offset:偏移量。
count:數(shù)據(jù)的長(zhǎng)度。返回值 成功返回實(shí)際拷貝的字節(jié)數(shù),失敗返回-1。字節(jié)序(1)小端模式小端模式是指將低字節(jié)存放在內(nèi)存的低地址處,例如,Intel80x86處理器采用該模式。(2)大端模式大端模式正好與小端模式相反,將高字節(jié)存放在內(nèi)存的低地址處,Motorola處理器采用這種模式,網(wǎng)絡(luò)字節(jié)序采用大端模式,字節(jié)序的存儲(chǔ)模式High-orderbyteLow-orderbyte高位16位/2字節(jié)
低位Low-orderbyteHigh-orderbyte地址增長(zhǎng)的方向地址增長(zhǎng)的方向AddressAAddressA+1小端模式大端模式AddressA+1AddressA字節(jié)對(duì)齊
理論上。任意類(lèi)型的數(shù)據(jù)可存儲(chǔ)于內(nèi)存的任意位置,但出于效率等因素的考慮,某些處理器對(duì)數(shù)據(jù)的存儲(chǔ)地址有一定的要求,n字節(jié)對(duì)齊是指數(shù)據(jù)的存儲(chǔ)地址為n的整數(shù)倍,例如,對(duì)于IntelX86,簡(jiǎn)單類(lèi)型和結(jié)構(gòu)類(lèi)型的存儲(chǔ)地址均為4的整數(shù)倍。12.4Unix域套接字Unix域概述Unix域是一種特殊的傳輸協(xié)議,用于本地進(jìn)程間通信,支持面向連接和無(wú)連接兩種傳輸服務(wù)。在使用socket編寫(xiě)服務(wù)器和庫(kù)戶(hù)籍時(shí),僅協(xié)議族和地址類(lèi)型有所不同。Unix域套接字1.創(chuàng)建Unix域套接字Unix_socket=socket(AF_UNIX,type,0);2.Unix域的地址struct
sockaddr_un{
sa_family_t
sun_family;//取值A(chǔ)F_UNIX charsun_path[108];//文件路徑};互聯(lián)套接字
為了便于本地關(guān)聯(lián)進(jìn)程間通信,內(nèi)核引入了socketpair接口函數(shù)用于創(chuàng)建一對(duì)互聯(lián)套接字,通過(guò)它可實(shí)現(xiàn)父子進(jìn)程或兩子進(jìn)程間通信。相較于無(wú)名管道的單向數(shù)據(jù)傳輸互聯(lián)套接字可實(shí)現(xiàn)雙向數(shù)據(jù)傳輸。創(chuàng)建互聯(lián)套接字socketpair函數(shù)頭文件
#include<sys/socket.h>函數(shù)原型
int
socketpair(intdomain,inttype,intprotocol,intsv[2]););功能 創(chuàng)建一對(duì)互聯(lián)套接字。參數(shù)
domain:協(xié)議族。
type:協(xié)議類(lèi)型。
protocol:子協(xié)議類(lèi)型。
sv[2]:一對(duì)互聯(lián)套接字的文件描述符。返回值 成功返回0,失敗返回-1。12.5套接字選項(xiàng)套接字選項(xiàng)概述
每個(gè)套接字都有自身的行為屬性,它們決定了套接字在收發(fā)數(shù)據(jù)時(shí)的行為特征。為了滿(mǎn)足個(gè)性化需要,內(nèi)核引入了getsockopt/setsockopt接口函數(shù),用于獲取/設(shè)置套接字的選項(xiàng),以便套接字的行為符合用戶(hù)的需求。獲取/設(shè)置套接字選項(xiàng)getsockopt/setsockopt函數(shù)頭文件
#include<sys/socket.h>函數(shù)原型
int
getsockopt(int
sockfd,int
level,int
optname,void*optval,socklen_t*optlen);
int
setsockopt(int
sockfd,int
level,int
optname,void*optval,socklen_t
optlen);功能 獲取/設(shè)置套接字選項(xiàng)。參數(shù)
sockfd:套接字的文件描述符。
Level:協(xié)議層類(lèi)型。
optname:選項(xiàng)名稱(chēng)。
optval:選項(xiàng)值。
optlen:optval占用的字節(jié)數(shù)。返回值 成功返回0,失敗返回-1。通用選項(xiàng)參數(shù)optname類(lèi)型定義SO_BROADCASTBOOL允許/禁止發(fā)送廣播消息SO_DEBUGBOOL設(shè)置是否允許調(diào)試SO_DONTROUTEBOOL設(shè)置是否繞過(guò)正常的路由器SO_KEEPALIVEBOOL定時(shí)監(jiān)測(cè)連接是否處于活動(dòng)狀態(tài)SO_LINGERLINGER關(guān)閉鏈接時(shí)的超時(shí)設(shè)置SO_OOBINLINEBOOL設(shè)置緊急數(shù)據(jù)放入普通數(shù)據(jù)流SO_RCVBUFint設(shè)置接收緩沖區(qū)的大小SO_REUSEADDRBOOL打開(kāi)或關(guān)閉地址復(fù)用功能SO_RCVTIMEODWORD設(shè)置接收函數(shù)的超時(shí)時(shí)間(毫秒)SO_SNDBUFint設(shè)置發(fā)送緩沖區(qū)的大小
通用選項(xiàng)位于套接字接口層,是對(duì)各類(lèi)協(xié)議接口的抽象,與特定的協(xié)議無(wú)關(guān),但并非通用選項(xiàng)適用于所有協(xié)議。LINGER選項(xiàng)
該選項(xiàng)用于定義關(guān)閉連接時(shí)的超時(shí)設(shè)置,選項(xiàng)值的類(lèi)型定義如下。#including<sys/socket.h> structlinger{ intl_onoff;//0表示關(guān)閉,非0表示打開(kāi) intl_linger;//超時(shí)時(shí)間(秒)};LINGER選項(xiàng)(續(xù))若成員變量l_onoff置為0,內(nèi)核默認(rèn)設(shè)置,該選項(xiàng)關(guān)閉,成員變量l_linger的值被忽略,close/shutdown立即返回,殘留在發(fā)送緩沖區(qū)的數(shù)據(jù)被丟棄。2.若成員變量l_onoff置為非0,l_linger設(shè)置超時(shí)時(shí)間,調(diào)用的close/shutdown函數(shù)掛起,直至內(nèi)核發(fā)送緩沖區(qū)的數(shù)據(jù)全部被對(duì)方確認(rèn)或超時(shí)時(shí)間到期;若到期仍有未確認(rèn)的數(shù)據(jù),則向
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年消防通風(fēng)承包合同協(xié)議書(shū)范本
- 2024年購(gòu)貓合同請(qǐng)查收安心你我它
- 摩托車(chē)買(mǎi)賣(mài)合同范本
- 果蔬投標(biāo)擔(dān)保書(shū)
- 內(nèi)部技能培訓(xùn)合作協(xié)議書(shū)
- 廣東省室內(nèi)裝潢設(shè)計(jì)工程施工合同
- 專(zhuān)業(yè)股權(quán)投資合作協(xié)議書(shū)樣本
- 服裝制造合作合同參考
- 2024年離婚協(xié)議書(shū)的范本
- 房屋交易資金代收代付協(xié)議
- 高中數(shù)學(xué)大單元教學(xué)設(shè)計(jì)研究
- 人教版七年級(jí)英語(yǔ)上冊(cè)教學(xué)課件Unit 3 My School
- 2024-2030年中國(guó)節(jié)慶飾品市場(chǎng)發(fā)展趨勢(shì)及營(yíng)銷(xiāo)策略分析報(bào)告
- 新視野大學(xué)英語(yǔ)(第四版)讀寫(xiě)教程3(思政智慧版)課件 B3U5 Chinas space dream Section C
- 幼兒園社會(huì)《認(rèn)識(shí)警察》課件
- 期中模擬試題2024-2025學(xué)年牛津譯林版英語(yǔ)七年級(jí)上冊(cè)
- GB/T 23862-2024文物包裝與運(yùn)輸規(guī)范
- 九年級(jí)化學(xué)上冊(cè)(滬教版2024)新教材解讀課件
- 《離散數(shù)學(xué)》總復(fù)習(xí)
- HJ1188-2021核醫(yī)學(xué)輻射防護(hù)與安全要求
- 【新教材】人教版(2024)七年級(jí)上冊(cè)地理第一章 地球 學(xué)情評(píng)估試卷(含答案)
評(píng)論
0/150
提交評(píng)論