UNIX常用系統(tǒng)函數(shù)_第1頁
UNIX常用系統(tǒng)函數(shù)_第2頁
UNIX常用系統(tǒng)函數(shù)_第3頁
UNIX常用系統(tǒng)函數(shù)_第4頁
UNIX常用系統(tǒng)函數(shù)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 UNIX常用系統(tǒng)函數(shù)-getopt(分析命令行參數(shù)) 相關(guān)函數(shù) 表頭文件 #include定義函數(shù) int getopt(int argc,char * const argv ,const char * optstring);函數(shù)說明 getopt()用來分析命令行參數(shù)。參數(shù)argc和argv是由main()傳遞的參數(shù)個(gè)數(shù)和內(nèi)容。參數(shù)optstring 則代表欲處理的選項(xiàng)字符串。此函數(shù)會(huì)返回在argv 中下一個(gè)的選項(xiàng)字母,此字母會(huì)對應(yīng)參數(shù)optstring 中的字母。如果選項(xiàng)字符串里的字母后接著冒號(hào):,則表示還有相關(guān)的參數(shù),全域變量optarg 即會(huì)指向此額外參數(shù)。如果getopt()找不到

2、符合的參數(shù)則會(huì)印出錯(cuò)信息,并將全域變量optopt設(shè)為字符,如果不希望getopt()印出錯(cuò)信息,則只要將全域變量opterr設(shè)為0即可。 返回值 如果找到符合的參數(shù)則返回此參數(shù)字母,如果參數(shù)不包含在參數(shù)optstring 的選項(xiàng)字母則返回字符,分析結(jié)束則返回-1。范例 #include#includeint main(int argc,char *argv)int ch;opterr = 0;while(ch = getopt(argc,argv,a:bcde)!= -1) switch(ch)case a:printf(option a:%sn,optarg);break;case b:p

3、rintf(option b :bn);break;default:printf(other option :%cn,ch);printf(optopt +%cn,optopt); 執(zhí)行 $./getopt boption b:b$./getopt cother option:c$./getopt aother option :$./getopt a12345option a:12345 isatty(判斷文件描述詞是否是為終端機(jī)) 相關(guān)函數(shù) ttyname表頭文件 #include定義函數(shù) int isatty(int desc);函數(shù)說明 如果參數(shù)desc所代表的文件描述詞為一終端機(jī)則返回

4、1,否則返回0。返回值 如果文件為終端機(jī)則返回1,否則返回0。 范例 參考ttyname()。 select(I/O多工機(jī)制) 表頭文件 #include#include#include定義函數(shù) int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); 函數(shù)說明 select()用來等待文件描述詞狀態(tài)的改變。參數(shù)n代表最大的文件描述詞加1,參數(shù)readfds、writefds 和exceptfds 稱為描述詞組,是用來回傳該描述詞的讀,寫或例外的狀況。底下的

5、宏提供了處理這三種描述詞組的方式:FD_CLR(inr fd,fd_set* set);用來清除描述詞組set中相關(guān)fd 的位FD_ISSET(int fd,fd_set *set);用來測試描述詞組set中相關(guān)fd 的位是否為真 FD_SET(int fd,fd_set*set);用來設(shè)置描述詞組set中相關(guān)fd的位FD_ZERO(fd_set *set); 用來清除描述詞組set的全部位參數(shù) timeout為結(jié)構(gòu)timeval,用來設(shè)置select()的等待時(shí)間,其結(jié)構(gòu)定義如下struct timevaltime_t tv_sec;time_t tv_usec;返回值 如果參數(shù)timeou

6、t設(shè)為NULL則表示select()沒有timeout。 錯(cuò)誤代碼 執(zhí)行成功則返回文件描述詞狀態(tài)已改變的個(gè)數(shù),如果返回0代表在描述詞狀態(tài)改變前已超過timeout時(shí)間,當(dāng)有錯(cuò)誤發(fā)生時(shí)則返回-1,錯(cuò)誤原因存于errno,此時(shí)參數(shù)readfds,writefds,exceptfds和timeout的值變成不可預(yù)測。EBADF 文件描述詞為無效的或該文件已關(guān)閉EINTR 此調(diào)用被信號(hào)所中斷EINVAL 參數(shù)n 為負(fù)值。ENOMEM 核心內(nèi)存不足范例 常見的程序片段:fs_set readset;FD_ZERO(&readset);FD_SET(fd,&readset);select(fd+1,&re

7、adset,NULL,NULL,NULL);if(FD_ISSET(fd,readset) ttyname(返回一終端機(jī)名稱) 相關(guān)函數(shù) Isatty表頭文件 #include定義函數(shù) char * ttyname(int desc);函數(shù)說明 如果參數(shù)desc所代表的文件描述詞為一終端機(jī),則會(huì)將此終端機(jī)名稱由一字符串指針返回,否則返回NULL。返回值 如果成功則返回指向終端機(jī)名稱的字符串指針,有錯(cuò)誤情況發(fā)生時(shí)則返回NULL。 范例 #include#include#include #includemain()int fd;char * file = /dev/tty;fd = open (f

8、iel,O_RDONLY); printf(%s,file); if(isatty(fd)printf(is a tty.n);printf(ttyname = %s n,ttyname(fd);else printf( is not a ttyn);close(fd);執(zhí)行 /dev/tty is a tty ttyname = /dev/tty 添加評論 | 閱讀評論 (1) 3:45 | 固定鏈接 | 引用通告 (0) | 記錄它 固定鏈接 關(guān)閉 getenv(取得環(huán)境變量內(nèi)容) 相關(guān)函數(shù) putenv,setenv,unsetenv表頭文件 #include定義函數(shù) char * ge

9、tenv(const char *name);函數(shù)說明 getenv()用來取得參數(shù)name環(huán)境變量的內(nèi)容。參數(shù)name為環(huán)境變量的名稱,如果該變量存在則會(huì)返回指向該內(nèi)容的指針。環(huán)境變量的格式為namevalue。 返回值 執(zhí)行成功則返回指向該內(nèi)容的指針,找不到符合的環(huán)境變量名稱則返回NULL。范例 #includemian()char *p;if(p = getenv(USER)printf(USER=%sn,p);執(zhí)行 USER = root putenv(改變或增加環(huán)境變量) 相關(guān)函數(shù) getenv,setenv,unsetenv表頭文件 #include4定義函數(shù) int putenv

10、(const char * string);函數(shù)說明 putenv()用來改變或增加環(huán)境變量的內(nèi)容。參數(shù)string的格式為namevalue,如果該環(huán)境變量原先存在,則變量內(nèi)容會(huì)依參數(shù)string改變,否則此參數(shù)內(nèi)容會(huì)成為新的環(huán)境變量。 返回值 執(zhí)行成功則返回0,有錯(cuò)誤發(fā)生則返回-1。錯(cuò)誤代碼 ENOMEM 內(nèi)存不足,無法配置新的環(huán)境變量空間。范例 #includemain()char *p;if(p = getenv(USER)printf(USER =%sn,p);putenv(USER=test); printf(USER+5sn,getenv(USER);執(zhí)行 USER=rootUS

11、ER=root setenv(改變或增加環(huán)境變量) 相關(guān)函數(shù) getenv,putenv,unsetenv表頭文件 #include定義函數(shù) int setenv(const char *name,const char * value,int overwrite);函數(shù)說明 setenv()用來改變或增加環(huán)境變量的內(nèi)容。參數(shù)name為環(huán)境變量名稱字符串。 參數(shù) value則為變量內(nèi)容,參數(shù)overwrite用來決定是否要改變已存在的環(huán)境變量。如果overwrite不為0,而該環(huán)境變量原已有內(nèi)容,則原內(nèi)容會(huì)被改為參數(shù)value所指的變量內(nèi)容。如果overwrite為0,且該環(huán)境變量已有內(nèi)容,則參

12、數(shù)value會(huì)被忽略。返回值 執(zhí)行成功則返回0,有錯(cuò)誤發(fā)生時(shí)返回-1。錯(cuò)誤代碼 ENOMEM 內(nèi)存不足,無法配置新的環(huán)境變量空間范例 #includemain()char * p;if(p=getenv(USER)printf(USER =%sn,p);setenv(USER,test,1);printf(USER=%sn,getenv(USEr); unsetenv(USER);printf(USER=%sn,getenv(USER); 執(zhí)行 USER = rootUSER = testUSER = (null) 添加評論 3:44 | 固定鏈接 | 引用通告 (0) | 記錄它 固定鏈接

13、關(guān)閉 accept(接受socket連線) 相關(guān)函數(shù) socket,bind,listen,connect表頭文件 #include#include定義函數(shù) int accept(int s,struct sockaddr * addr,int * addrlen);函數(shù)說明 accept()用來接受參數(shù)s的socket連線。參數(shù)s的socket必需先經(jīng)bind()、listen()函數(shù)處理過,當(dāng)有連線進(jìn)來時(shí)accept()會(huì)返回一個(gè)新的socket處理代碼,往后的數(shù)據(jù)傳送與讀取就是經(jīng)由新的socket處理,而原來參數(shù)s的socket能繼續(xù)使用accept()來接受新的連線要求。連線成功時(shí),參

14、數(shù)addr所指的結(jié)構(gòu)會(huì)被系統(tǒng)填入遠(yuǎn)程主機(jī)的地址數(shù)據(jù),參數(shù)addrlen為scokaddr的結(jié)構(gòu)長度。關(guān)于結(jié)構(gòu)sockaddr的定義請參考bind()。 返回值 成功則返回新的socket處理代碼,失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼 EBADF 參數(shù)s 非合法socket處理代碼。EFAULT 參數(shù)addr指針指向無法存取的內(nèi)存空間。ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EOPNOTSUPP 指定的socket并非SOCK_STREAM。EPERM 防火墻拒絕此連線。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足。 ENOMEM 核心內(nèi)存不足。范例 參考listen()。 b

15、ind(對socket定位) 相關(guān)函數(shù) socket,accept,connect,listen表頭文件 #include#include定義函數(shù) int bind(int sockfd,struct sockaddr * my_addr,int addrlen); 函數(shù)說明 bind()用來設(shè)置給參數(shù)sockfd的socket一個(gè)名稱。此名稱由參數(shù)my_addr指向一sockaddr結(jié)構(gòu),對于不同的socket domain定義了一個(gè)通用的數(shù)據(jù)結(jié)構(gòu)struct sockaddrunsigned short int sa_family;char sa_data14;sa_family 為調(diào)用s

16、ocket()時(shí)的domain參數(shù),即AF_xxxx值。 sa_data 最多使用14個(gè)字符長度。此sockaddr結(jié)構(gòu)會(huì)因使用不同的socket domain而有不同結(jié)構(gòu)定義,例如使用AF_INET domain,其socketaddr結(jié)構(gòu)定義便為struct socketaddr_inunsigned short int sin_family;uint16_t sin_port;struct in_addr sin_addr;unsigned char sin_zero8;struct in_addruint32_t s_addr;sin_family 即為sa_familysin_por

17、t 為使用的port編號(hào)sin_addr.s_addr 為IP 地址sin_zero 未使用。參數(shù) addrlen為sockaddr的結(jié)構(gòu)長度。返回值 成功則返回0,失敗返回-1,錯(cuò)誤原因存于errno中。 錯(cuò)誤代碼 EBADF 參數(shù)sockfd 非合法socket處理代碼。EACCESS 權(quán)限不足ENOTSOCK 參數(shù)sockfd為一文件描述詞,非socket。范例 參考listen() connect(建立socket連線) 相關(guān)函數(shù) socket,bind,listen表頭文件 #include#include定義函數(shù) int connect (int sockfd,struct soc

18、kaddr * serv_addr,int addrlen); 函數(shù)說明 connect()用來將參數(shù)sockfd 的socket 連至參數(shù)serv_addr 指定的網(wǎng)絡(luò)地址。結(jié)構(gòu)sockaddr請參考bind()。參數(shù)addrlen為sockaddr的結(jié)構(gòu)長度。返回值 成功則返回0,失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼 EBADF 參數(shù)sockfd 非合法socket處理代碼EFAULT 參數(shù)serv_addr指針指向無法存取的內(nèi)存空間 ENOTSOCK 參數(shù)sockfd為一文件描述詞,非socket。EISCONN 參數(shù)sockfd的socket已是連線狀態(tài)ECONNREFUS

19、ED 連線要求被server端拒絕。ETIMEDOUT 企圖連線的操作超過限定時(shí)間仍未有響應(yīng)。ENETUNREACH 無法傳送數(shù)據(jù)包至指定的主機(jī)。EAFNOSUPPORT sockaddr結(jié)構(gòu)的sa_family不正確。EALREADY socket為不可阻斷且先前的連線操作還未完成。 執(zhí)行 $ ./connectWelcome to server!hi I am client! /*鍵盤輸入*/*中斷程序*/ endprotoent(結(jié)束網(wǎng)絡(luò)協(xié)議數(shù)據(jù)的讀取) 相關(guān)函數(shù) getprotoent,getprotobyname,getprotobynumber,setprotoent表頭文件 #i

20、nclude定義函數(shù) void endprotoent(void);函數(shù)說明 endprotoent()用來關(guān)閉由getprotoent()打開的文件。 返回值 范例 參考getprotoent() endservent(結(jié)束網(wǎng)絡(luò)服務(wù)數(shù)據(jù)的讀?。?相關(guān)函數(shù) getservent,getservbyname,getservbyport,setservent表頭文件 #include定義函數(shù) void endservent(void);函數(shù)說明 endservent()用來關(guān)閉由getservent()所打開的文件。 返回值 范例 參考getservent()。 getsockopt(取得sock

21、et狀態(tài)) 相關(guān)函數(shù) setsockopt表頭文件 #include#include定義函數(shù) int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen); 函數(shù)說明 getsockopt()會(huì)將參數(shù)s所指定的socket狀態(tài)返回。參數(shù)optname代表欲取得何種選項(xiàng)狀態(tài),而參數(shù)optval則指向欲保存結(jié)果的內(nèi)存地址,參數(shù)optlen則為該空間的大小。參數(shù)level、optname請參考setsockopt()。返回值 成功則返回0,若有錯(cuò)誤則返回-1,錯(cuò)誤原因存于errno錯(cuò)誤代碼 EBADF 參數(shù)s 并

22、非合法的socket處理代碼 ENOTSOCK 參數(shù)s為一文件描述詞,非socketENOPROTOOPT 參數(shù)optname指定的選項(xiàng)不正確EFAULT 參數(shù)optval指針指向無法存取的內(nèi)存空間范例 #include#includemain()int s,optval,optlen = sizeof(int); if(s = socket(AF_INET,SOCK_STREAM,0)0) perror(socket);getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);printf(optval = %dn,optval);close(s);執(zhí)

23、行 optval = 1 /*SOCK_STREAM的定義正是此值*/ htonl(將32位主機(jī)字符順序轉(zhuǎn)換成網(wǎng)絡(luò)字符順序) 相關(guān)函數(shù) htons,ntohl,ntohs表頭文件 #include定義函數(shù) unsigned long int htonl(unsigned long int hostlong);函數(shù)說明 htonl()用來將參數(shù)指定的32位hostlong 轉(zhuǎn)換成網(wǎng)絡(luò)字符順序。 返回值 返回對應(yīng)的網(wǎng)絡(luò)字符順序。范例 參考getservbyport()或connect()。 htons(將16位主機(jī)字符順序轉(zhuǎn)換成網(wǎng)絡(luò)字符順序) 相關(guān)函數(shù) htonl,ntohl,ntohs表頭文件

24、#include定義函數(shù) unsigned short int htons(unsigned short int hostshort);函數(shù)說明 htons()用來將參數(shù)指定的16位hostshort轉(zhuǎn)換成網(wǎng)絡(luò)字符順序。 返回值 返回對應(yīng)的網(wǎng)絡(luò)字符順序。范例 參考connect()。 inet_addr(將網(wǎng)絡(luò)地址轉(zhuǎn)成二進(jìn)制的數(shù)字) 相關(guān)函數(shù) inet_aton,inet_ntoa表頭文件 #include#include#include定義函數(shù) unsigned long int inet_addr(const char *cp); 返回值 成功則返回對應(yīng)的網(wǎng)絡(luò)二進(jìn)制的數(shù)字,失敗返回-1。

25、inet_aton(將網(wǎng)絡(luò)地址轉(zhuǎn)成網(wǎng)絡(luò)二進(jìn)制的數(shù)字) 相關(guān)函數(shù) inet_addr,inet_ntoa表頭文件 #include#include#include定義函數(shù) int inet_aton(const char * cp,struct in_addr *inp); 函數(shù)說明 inet_aton()用來將參數(shù)cp所指的網(wǎng)絡(luò)地址字符串轉(zhuǎn)換成網(wǎng)絡(luò)使用的二進(jìn)制的數(shù)字,然后存于參數(shù)inp所指的in_addr結(jié)構(gòu)中。結(jié)構(gòu)in_addr定義如下struct in_addrunsigned long int s_addr;返回值 成功則返回非0值,失敗則返回0。 inet_ntoa(將網(wǎng)絡(luò)二進(jìn)制的數(shù)字

26、轉(zhuǎn)換成網(wǎng)絡(luò)地址) 相關(guān)函數(shù) inet_addr,inet_aton表頭文件 #include#include#include定義函數(shù) char * inet_ntoa(struct in_addr in); 函數(shù)說明 inet_ntoa()用來將參數(shù)in所指的網(wǎng)絡(luò)二進(jìn)制的數(shù)字轉(zhuǎn)換成網(wǎng)絡(luò)地址,然后將指向此網(wǎng)絡(luò)地址字符串的指針返回。返回值 成功則返回字符串指針,失敗則返回NULL。 listen(等待連接) 相關(guān)函數(shù) socket,bind,accept,connect表頭文件 #include定義函數(shù) int listen(int s,int backlog);函數(shù)說明 listen()用來等待

27、參數(shù)s 的socket連線。參數(shù)backlog指定同時(shí)能處理的最大連接要求,如果連接數(shù)目達(dá)此上限則client端將收到ECONNREFUSED的錯(cuò)誤。Listen()并未開始接收連線,只是設(shè)置socket為listen模式,真正接收client端連線的是accept()。通常listen()會(huì)在socket(),bind()之后調(diào)用,接著才調(diào)用accept()。 返回值 成功則返回0,失敗返回-1,錯(cuò)誤原因存于errno附加說明 listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數(shù)backlog 最大值可設(shè)至128

28、。錯(cuò)誤代碼 EBADF 參數(shù)sockfd非合法socket處理代碼EACCESS 權(quán)限不足EOPNOTSUPP 指定的socket并未支援listen模式。 ntohl(將32位網(wǎng)絡(luò)字符順序轉(zhuǎn)換成主機(jī)字符順序) 相關(guān)函數(shù) htonl,htons,ntohs表頭文件 #include定義函數(shù) unsigned long int ntohl(unsigned long int netlong);函數(shù)說明 ntohl()用來將參數(shù)指定的32位netlong轉(zhuǎn)換成主機(jī)字符順序。 返回值 返回對應(yīng)的主機(jī)字符順序。范例 參考getservent()。 ntohs(將16位網(wǎng)絡(luò)字符順序轉(zhuǎn)換成主機(jī)字符順序)

29、相關(guān)函數(shù) htonl,htons,ntohl表頭文件 #include定義函數(shù) unsigned short int ntohs(unsigned short int netshort);函數(shù)說明 ntohs()用來將參數(shù)指定的16位netshort轉(zhuǎn)換成主機(jī)字符順序。 返回值 返回對應(yīng)的主機(jī)順序。范例 參考getservent()。 recv(經(jīng)socket接收數(shù)據(jù)) 相關(guān)函數(shù) recvfrom,recvmsg,send,sendto,socket表頭文件 #include#include定義函數(shù) int recv(int s,void *buf,int len,unsigned int f

30、lags); 函數(shù)說明 recv()用來接收遠(yuǎn)端主機(jī)經(jīng)指定的socket傳來的數(shù)據(jù),并把數(shù)據(jù)存到由參數(shù)buf 指向的內(nèi)存空間,參數(shù)len為可接收數(shù)據(jù)的最大長度。參數(shù) flags一般設(shè)0。其他數(shù)值定義如下:MSG_OOB 接收以out-of-band 送出的數(shù)據(jù)。MSG_PEEK 返回來的數(shù)據(jù)并不會(huì)在系統(tǒng)內(nèi)刪除,如果再調(diào)用recv()會(huì)返回相同的數(shù)據(jù)內(nèi)容。MSG_WAITALL強(qiáng)迫接收到len大小的數(shù)據(jù)后才能返回,除非有錯(cuò)誤或信號(hào)產(chǎn)生。 MSG_NOSIGNAL此操作不愿被SIGPIPE信號(hào)中斷返回值成功則返回接收到的字符數(shù),失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼 EBADF 參數(shù)s非

31、合法的socket處理代碼EFAULT 參數(shù)中有一指針指向無法存取的內(nèi)存空間ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷EAGAIN 此動(dòng)作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷 ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足。ENOMEM 核心內(nèi)存不足EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。范例 參考listen()。 recvfrom(經(jīng)socket接收數(shù)據(jù)) 相關(guān)函數(shù) recv,recvmsg,send,sendto,socket表頭文件 #include#include定義函數(shù) int recvfrom(int s,void *buf,int len,u

32、nsigned int flags ,struct sockaddr *from ,int *fromlen); 函數(shù)說明 recv()用來接收遠(yuǎn)程主機(jī)經(jīng)指定的socket 傳來的數(shù)據(jù),并把數(shù)據(jù)存到由參數(shù)buf 指向的內(nèi)存空間,參數(shù)len 為可接收數(shù)據(jù)的最大長度。參數(shù)flags 一般設(shè)0,其他數(shù)值定義請參考recv()。參數(shù)from用來指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)sockaddr 請參考bind()。參數(shù)fromlen為sockaddr的結(jié)構(gòu)長度。返回值 成功則返回接收到的字符數(shù),失敗則返回-1,錯(cuò)誤原因存于errno中。 錯(cuò)誤代碼 EBADF 參數(shù)s非合法的socket處理代碼EFAULT 參

33、數(shù)中有一指針指向無法存取的內(nèi)存空間。ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷。EAGAIN 此動(dòng)作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足ENOMEM 核心內(nèi)存不足EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。執(zhí)行 (先執(zhí)行udp server 再執(zhí)行udp client)hello /*從鍵盤輸入字符串*/receive: hello /*server端返回來的字符串*/ recvmsg(經(jīng)socket接收數(shù)據(jù)) 相關(guān)函數(shù) recv,recvfrom,send,sendto,sendmsg,socket表頭文件 #i

34、nclude#include定義函數(shù) int recvmsg(int s,struct msghdr *msg,unsigned int flags); 函數(shù)說明 recvmsg()用來接收遠(yuǎn)程主機(jī)經(jīng)指定的socket傳來的數(shù)據(jù)。參數(shù)s為已建立好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過連線操作。參數(shù)msg指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,參數(shù)flags一般設(shè)0,詳細(xì)描述請參考send()。關(guān)于結(jié)構(gòu)msghdr的定義請參考sendmsg()。返回值 成功則返回接收到的字符數(shù),失敗則返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼 EBADF 參數(shù)s非合法的socket處理代碼。 EFAULT 參數(shù)中

35、有一指針指向無法存取的內(nèi)存空間ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷。EAGAIN 此操作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足ENOMEM 核心內(nèi)存不足EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。范例 參考recvfrom()。 send(經(jīng)socket傳送數(shù)據(jù)) 相關(guān)函數(shù) sendto,sendmsg,recv,recvfrom,socket表頭文件 #include#include定義函數(shù) int send(int s,const void * msg,int len,unsigned int falgs)

36、; 函數(shù)說明 send()用來將數(shù)據(jù)由指定的socket 傳給對方主機(jī)。參數(shù)s為已建立好連接的socket。參數(shù)msg指向欲連線的數(shù)據(jù)內(nèi)容,參數(shù)len則為數(shù)據(jù)長度。參數(shù)flags一般設(shè)0,其他數(shù)值定義如下MSG_OOB 傳送的數(shù)據(jù)以out-of-band 送出。MSG_DONTROUTE 取消路由表查詢MSG_DONTWAIT 設(shè)置為不可阻斷運(yùn)作MSG_NOSIGNAL 此動(dòng)作不愿被SIGPIPE 信號(hào)中斷。 返回值 成功則返回實(shí)際傳送出去的字符數(shù),失敗返回-1。錯(cuò)誤原因存于errno錯(cuò)誤代碼 EBADF 參數(shù)s 非合法的socket處理代碼。EFAULT 參數(shù)中有一指針指向無法存取的內(nèi)存空間

37、ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷。EAGAIN 此操作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足 ENOMEM 核心內(nèi)存不足EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。范例 參考connect() sendmsg(經(jīng)socket傳送數(shù)據(jù)) 相關(guān)函數(shù) send,sendto,recv,recvfrom,recvmsg,socket表頭文件 #include#include定義函數(shù) int sendmsg(int s,const strcut msghdr *msg,unsigned int flags); 函數(shù)說

38、明 sendmsg()用來將數(shù)據(jù)由指定的socket傳給對方主機(jī)。參數(shù)s為已建立好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過連線操作。參數(shù)msg 指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,參數(shù)flags一般默認(rèn)為0,詳細(xì)描述請參考send()。結(jié)構(gòu)msghdr定義如下struct msghdrvoid *msg_name; /*Address to send to /receive from . */ socklen_t msg_namelen; /* Length of addres data */strcut iovec * msg_iov; /* Vector of data to send/re

39、ceive into */size_t msg_iovlen; /* Number of elements in the vector */void * msg_control; /* Ancillary dat */ size_t msg_controllen; /* Ancillary data buffer length */int msg_flags; /* Flags on received message */;返回值 成功則返回實(shí)際傳送出去的字符數(shù),失敗返回-1,錯(cuò)誤原因存于errno錯(cuò)誤代碼 EBADF 參數(shù)s 非合法的socket處理代碼。EFAULT 參數(shù)中有一指針指向無法

40、存取的內(nèi)存空間 ENOTSOCK 參數(shù)s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷。EAGAIN 此操作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足ENOMEM 核心內(nèi)存不足EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。范例 參考sendto()。 sendto(經(jīng)socket傳送數(shù)據(jù)) 相關(guān)函數(shù) send , sendmsg,recv , recvfrom , socket表頭文件 #include #include 定義函數(shù) int sendto ( int s , const void * msg, int len, unsigned int

41、 flags, const struct sockaddr * to , int tolen ) ;函數(shù)說明 sendto() 用來將數(shù)據(jù)由指定的socket傳給對方主機(jī)。參數(shù)s為已建好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過連線操作。參數(shù)msg指向欲連線的數(shù)據(jù)內(nèi)容,參數(shù)flags 一般設(shè)0,詳細(xì)描述請參考send()。參數(shù)to用來指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)sockaddr請參考bind()。參數(shù)tolen為sockaddr的結(jié)果長度。 返回值 成功則返回實(shí)際傳送出去的字符數(shù),失敗返回1,錯(cuò)誤原因存于errno 中。錯(cuò)誤代碼 EBADF 參數(shù)s非法的socket處理代碼。EFAULT

42、參數(shù)中有一指針指向無法存取的內(nèi)存空間。WNOTSOCK canshu s為一文件描述詞,非socket。EINTR 被信號(hào)所中斷。EAGAIN 此動(dòng)作會(huì)令進(jìn)程阻斷,但參數(shù)s的soket為補(bǔ)課阻斷的。ENOBUFS 系統(tǒng)的緩沖內(nèi)存不足。 EINVAL 傳給系統(tǒng)調(diào)用的參數(shù)不正確。執(zhí)行 請參考recvfrom() setprotoent(打開網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)文件) 相關(guān)函數(shù) getprotobyname, getprotobynumber, endprotoent表頭文件 #include 定義函數(shù) void setprotoent (int stayopen);函數(shù)說明 setprotoent()用

43、來打開/etc/protocols, 如果參數(shù)stayopen值為1,則接下來的getprotobyname()或getprotobynumber()將不會(huì)自動(dòng)關(guān)閉此文件。 setservent(打開主機(jī)網(wǎng)絡(luò)服務(wù)的數(shù)據(jù)文件) 相關(guān)函數(shù) getservent, getservbyname, getservbyport, endservent表頭文件 #include 定義函數(shù) void setservent (int stayopen);函數(shù)說明 setservent()用來打開/etc/services,如果參數(shù)stayopen值為1,則接下來的getservbyname()或getservb

44、yport()將補(bǔ)回自動(dòng)關(guān)閉文件。 setsockopt(設(shè)置socket狀態(tài)) 相關(guān)函數(shù) getsockopt表頭文件 #include#include定義函數(shù) int setsockopt(int s,int level,int optname,const void * optval,socklen_toptlen); 函數(shù)說明 setsockopt()用來設(shè)置參數(shù)s所指定的socket狀態(tài)。參數(shù)level代表欲設(shè)置的網(wǎng)絡(luò)層,一般設(shè)成SOL_SOCKET以存取socket層。參數(shù)optname代表欲設(shè)置的選項(xiàng),有下列幾種數(shù)值:SO_DEBUG 打開或關(guān)閉排錯(cuò)模式SO_REUSEADDR 允

45、許在bind()過程中本地地址可重復(fù)使用SO_TYPE 返回socket形態(tài)。SO_ERROR 返回socket已發(fā)生的錯(cuò)誤原因 SO_DONTROUTE 送出的數(shù)據(jù)包不要利用路由設(shè)備來傳輸。SO_BROADCAST 使用廣播方式傳送SO_SNDBUF 設(shè)置送出的暫存區(qū)大小SO_RCVBUF 設(shè)置接收的暫存區(qū)大小SO_KEEPALIVE 定期確定連線是否已終止。SO_OOBINLINE 當(dāng)接收到OOB 數(shù)據(jù)時(shí)會(huì)馬上送至標(biāo)準(zhǔn)輸入設(shè)備SO_LINGER 確保數(shù)據(jù)安全且可靠的傳送出去。參數(shù) optval代表欲設(shè)置的值,參數(shù)optlen則為optval的長度。 返回值 成功則返回0,若有錯(cuò)誤則返回-1

46、,錯(cuò)誤原因存于errno。附加說明 EBADF 參數(shù)s并非合法的socket處理代碼ENOTSOCK 參數(shù)s為一文件描述詞,非socketENOPROTOOPT 參數(shù)optname指定的選項(xiàng)不正確。EFAULT 參數(shù)optval指針指向無法存取的內(nèi)存空間。范例 參考getsockopt()。 shutdown(終止socket通信) 相關(guān)函數(shù) socket,connect表頭文件 #include定義函數(shù) int shutdown(int s,int how);函數(shù)說明 shutdown()用來終止參數(shù)s所指定的socket連線。參數(shù)s是連線中的socket處理代碼,參數(shù)how有下列幾種情況:

47、 how=0 終止讀取操作。how=1 終止傳送操作how=2 終止讀取及傳送操作返回值 成功則返回0,失敗返回-1,錯(cuò)誤原因存于errno。錯(cuò)誤代碼 EBADF 參數(shù)s不是有效的socket處理代碼ENOTSOCK 參數(shù)s為一文件描述詞,非socketENOTCONN 參數(shù)s指定的socket并未連線 socket(建立一個(gè)socket通信) 相關(guān)函數(shù) accept,bind,connect,listen表頭文件 #include#include定義函數(shù) int socket(int domain,int type,int protocol);函數(shù)說明 socket()用來建立一個(gè)新的soc

48、ket,也就是向系統(tǒng)注冊,通知系統(tǒng)建立一通信端口。參數(shù)domain 指定使用何種的地址類型,完整的定義在/usr/include/bits/socket.h 內(nèi),底下是常見的協(xié)議: PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 進(jìn)程通信協(xié)議PF_INETAF_INET Ipv4網(wǎng)絡(luò)協(xié)議PF_INET6/AF_INET6 Ipv6 網(wǎng)絡(luò)協(xié)議 PF_IPX/AF_IPX IPX-Novell協(xié)議PF_NETLINK/AF_NETLINK 核心用戶接口裝置PF_X25/AF_X25 ITU-T X.25/ISO-8208 協(xié)議PF_AX25/AF_AX25 業(yè)余無線A

49、X.25協(xié)議PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCsPF_APPLETALK/AF_APPLETALK appletalk(DDP)協(xié)議PF_PACKET/AF_PACKET 初級封包接口參數(shù) type有下列幾種數(shù)值:SOCK_STREAM 提供雙向連續(xù)且可信賴的數(shù)據(jù)流,即TCP。支持OOB 機(jī)制,在所有數(shù)據(jù)傳送前必須使用connect()來建立連線狀態(tài)。 SOCK_DGRAM 使用不連續(xù)不可信賴的數(shù)據(jù)包連接SOCK_SEQPACKET 提供連續(xù)可信賴的數(shù)據(jù)包連接SOCK_RAW 提供原始網(wǎng)絡(luò)協(xié)議存取SOCK_RDM 提供可信賴的數(shù)據(jù)包連接 SOCK_PACKET 提供

50、和網(wǎng)絡(luò)驅(qū)動(dòng)程序直接通信。protocol用來指定socket所使用的傳輸協(xié)議編號(hào),通常此參考不用管它,設(shè)為0即可。返回值 成功則返回socket處理代碼,失敗返回-1。 錯(cuò)誤代碼 EPROTONOSUPPORT 參數(shù)domain指定的類型不支持參數(shù)type或protocol指定的協(xié)議ENFILE 核心內(nèi)存不足,無法建立新的socket結(jié)構(gòu)EMFILE 進(jìn)程文件表溢出,無法再建立新的socket EACCESS 權(quán)限不足,無法建立type或protocol指定的協(xié)議ENOBUFS/ENOMEM 內(nèi)存不足EINVAL 參數(shù)domain/type/protocol不合法 范例 參考connect()

51、。 添加評論 3:44 | 固定鏈接 | 引用通告 (0) | 記錄它 固定鏈接 關(guān)閉 alarm(設(shè)置信號(hào)傳送鬧鐘) 相關(guān)函數(shù) signal,sleep表頭文件 #include定義函數(shù) unsigned int alarm(unsigned int seconds);函數(shù)說明 alarm()用來設(shè)置信號(hào)SIGALRM在經(jīng)過參數(shù)seconds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seconds 為0,則之前設(shè)置的鬧鐘會(huì)被取消,并將剩下的時(shí)間返回。 返回值 返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回0。范例 #include#includevoid handler() printf(hellon);main()int i;signal(SIGALRM,handler);alarm(5);for(i=1;i7;i+)printf(sleep %d .n,i);sleep(1);執(zhí)行 sleep 1 .sleep 2 .sleep 3 .sleep 4 .sleep 5 .hellosleep 6 . kill(傳送信號(hào)給指定的進(jìn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論