




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Socket函數(shù)集(linux)收藏accept(接受socket連線)相關(guān)函數(shù)socket,bind,listen,connect表頭文件#includevsys/types.h#includevsys/socket.h定義函數(shù)intaccept(ints,structsockaddr*addr,int*addrlen);函數(shù)說(shuō)明accept()用來(lái)接受參數(shù)s的socket連線。參數(shù)s的socket必需先經(jīng)bind()、listen()函數(shù)處理過(guò),當(dāng)有連線進(jìn)來(lái)時(shí)accept()會(huì)返回一個(gè)新的socket處理代碼,往后的數(shù)據(jù)傳送與讀取就是經(jīng)由新的socket處理,而原來(lái)參數(shù)s的socket能繼
2、續(xù)使用accept()來(lái)接受新的連線要求。連線成功時(shí),參數(shù)addr所指的結(jié)構(gòu)會(huì)被系統(tǒng)填入遠(yuǎn)程主機(jī)的地址數(shù)據(jù),參數(shù)addrlen為scokaddr的結(jié)構(gòu)長(zhǎng)度。關(guān)于結(jié)構(gòu)sockaddr的定義請(qǐng)參考bind()。返回值成功則返回新的socket處理代碼,失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼EBADF參數(shù)s非合法socket處理代碼。EFAULT參數(shù)addr指針指向無(wú)法存取的內(nèi)存空間。ENOTSOCK參數(shù)s為一文件描述詞,非socket。EOPNOTSUPP指定的socket并非SOCK_STREAM。EPERM防火墻拒絕此連線。ENOBUFS系統(tǒng)的緩沖內(nèi)存不足。ENOMEM核心內(nèi)存不足。
3、范例參考listen()。bind(對(duì)socket定位)相關(guān)函數(shù)socket,accept,connect,listen表頭文#includevsys/types.h件#includevsys/socket.h定義函數(shù)intbind(intsockfd,structsockaddr*my_addr,intaddrlen);函數(shù)說(shuō)明bind()用來(lái)設(shè)置給參數(shù)sockfd的socket一個(gè)名稱。此名稱由參數(shù)my_addr指向一sockaddr結(jié)構(gòu),對(duì)于不同的socketdomain定義了一個(gè)通用的數(shù)據(jù)結(jié)構(gòu)。structsockaddrunsignedshortintsa_family;charsa
4、_data14;sa_family為調(diào)用socket()時(shí)的domain參數(shù),即AF_xxxx值。sa_data最多使用14個(gè)字符長(zhǎng)度。此sockaddr結(jié)構(gòu)會(huì)因使用不同的socketdomain而有不同結(jié)構(gòu)定義,例如使用AF_INETdomain,其socketaddr結(jié)構(gòu)定義便為structsocketaddr_inunsignedshortintsin_family;uint16_tsin_port;structin_addrsin_addr;unsignedcharsin_zero8;structin_addruint32_ts_addr;sin_family即為sa_familysi
5、n_port為使用的port編號(hào)sin_addr.s_addr為IP地址sin_zero未使用。參數(shù)說(shuō)addrlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。明返回值成功則返回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表頭文件#includevsys/types.h#includevsys/socket.h定義函數(shù)intconnect(intsockfd,
6、structsockaddr*serv_addr,intaddrlen);函數(shù)說(shuō)明connect()用來(lái)將參數(shù)sockfd的socket連至參數(shù)servaddr指定的網(wǎng)絡(luò)地址。結(jié)構(gòu)sockaddr請(qǐng)參考bind()。參數(shù)addrlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。返回值成功則返回0失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼EBADF參數(shù)sockfd非合法socket處理代碼EFAULT參數(shù)serv_addr指針指向無(wú)法存取的內(nèi)存空間ENOTSOCK參數(shù)sockfd為一文件描述詞,非socket。EISCONN參數(shù)sockfd的socket已是連線狀態(tài)ECONNREFUSED連線要求被se
7、rver端拒絕。ETIMEDOUT企圖連線的操作超過(guò)限定時(shí)間仍未有響應(yīng)。ENETUNREACH無(wú)法傳送數(shù)據(jù)包至指定的主機(jī)。EAFNOSUPPORTsockaddr結(jié)構(gòu)的sa_family不正確。EALREADYsocket為不可阻斷且先前的連線操作還未完成。范例/*利用socket的TCPclient*此程序會(huì)連線TCPserver,并將鍵盤輸入的字符串傳送給server。*TCPserver范例請(qǐng)參考listen()。*/#includevsys/stat.h#includevfcntl.h#includevunistd.h#includevsys/types.h#includevsys/s
8、ocket.h#includevnetinet/in.h#includevarpa/inet.h#definePORT1234#defineSERVER_IPmain()ints;structsockaddr_inaddr;charbuffer256;if(s=socket(AF_INET,SOCK_STREAM,0)vO)perror(socket);exit(1);/*填寫sockaddr_in結(jié)構(gòu)*/bzero(&addr,sizeof(addr);addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr
9、=inet_addr(SERVER_IP);/*嘗試連線*/if(connect(s,&addr,sizeof(addr)vO)perror(connect);exit(1);/*接收由server端傳來(lái)的信息*/recv(s,buffer,sizeof(buffer),0);printf(n,buffer);while(1)bzero(buffer,sizeof(buffer);/*從標(biāo)準(zhǔn)輸入設(shè)備取得字符串*/read(STDIN_FILENO,buffer,sizeof(buffer);/*將字符串傳給server端*/if(send(s,buffer,sizeof(buffer),0)中
10、斷程序*/endprotoent(結(jié)束網(wǎng)絡(luò)協(xié)議數(shù)據(jù)的讀取)相關(guān)函數(shù)getprotoent,getprotobyname,getprotobynumber,setprotoent表頭文件#ineludevnetdb.h定義函數(shù)voidendprotoent(void);函數(shù)說(shuō)明endprotoent()用來(lái)關(guān)閉由getprotoent()打開(kāi)的文件。返回值無(wú)返回值范例參考getprotoent()endservent(結(jié)束網(wǎng)絡(luò)服務(wù)數(shù)據(jù)的讀取)相關(guān)函數(shù)getservent,getservbyname,getservbyport,setservent表頭文件#includevnetdb.h定義函數(shù)v
11、oidendservent(void);函數(shù)說(shuō)明endservent()用來(lái)關(guān)閉由getservent()所打開(kāi)的文件。返回值無(wú)返回值范例參考getservent()。getsockopt(取得socket狀態(tài))相關(guān)函數(shù)setsockopt表頭文件#includevsys/types.h#includevsys/socket.h定義函數(shù)intgetsockopt(ints,intlevel,intoptname,void*optval,socklen_t*optlen);函數(shù)說(shuō)明getsockopt()會(huì)將參數(shù)s所指定的socket狀態(tài)返回。參數(shù)optname代表欲取得何種選項(xiàng)狀態(tài),而參數(shù)op
12、tval則指向欲保存結(jié)果的內(nèi)存地址,參數(shù)optlen則為該空間的大小。參數(shù)level、optname請(qǐng)參考setsockopt()。返回值成功則返回0若有錯(cuò)誤則返回-1,錯(cuò)誤原因存于errno錯(cuò)誤代碼EBADF參數(shù)s并非合法的socket處理代碼ENOTSOCK參數(shù)s為一文件描述詞,非socketENOPROTOOPT參數(shù)optname指定的選項(xiàng)不正確EFAULT參數(shù)optval指針指向無(wú)法存取的內(nèi)存空間范例#includevsys/types.h#includevsys/socket.hmain()ints,optval,optlen=sizeof(int);if(s=socket(AF_I
13、NET,SOCK_STREAM,0)vO)perror(socket);getsockopt(s,S0SOCKET,SO_TYPE,&optval,&optlen);printf(optval=dn,optval);close(s);執(zhí)行optval=1/*SOCK_STREAM的定義正是此值*/htonl(將32位主機(jī)字符順序轉(zhuǎn)換成網(wǎng)絡(luò)字符順序)相關(guān)函數(shù)htons,ntohl,ntohs表頭文件#includevnetinet/in.h定義函數(shù)unsignedlonginthtonl(unsignedlonginthostlong);函數(shù)說(shuō)明Htonl()用來(lái)將參數(shù)指定的32位hostlon
14、g轉(zhuǎn)換成網(wǎng)絡(luò)字符順序。返回值返回對(duì)應(yīng)的網(wǎng)絡(luò)字符順序。范例參考getservbyport()或connect()。htons(將16位主機(jī)字符順序轉(zhuǎn)換成網(wǎng)絡(luò)字符順序)相關(guān)函數(shù)htonl,ntohl,ntohs表頭文件#ineludevnetinet/in.h定義函數(shù)unsignedshortinthtons(unsignedshortinthostshort);函數(shù)說(shuō)明htons()用來(lái)將參數(shù)指定的16位hostshort轉(zhuǎn)換成網(wǎng)絡(luò)字符順序。返回值返回對(duì)應(yīng)的網(wǎng)絡(luò)字符順序。范例參考connect()。inet_addr(將網(wǎng)絡(luò)地址轉(zhuǎn)成二進(jìn)制的數(shù)字)相關(guān)函數(shù)inet_aton,inet_ntoa表頭
15、文件#includevsys/socket.h#includevnetinet/in.h#includevarpa/inet.h定義函數(shù)unsignedlongintinet_addr(constchar*cp);函數(shù)說(shuō)明inet_addr()用來(lái)將參數(shù)cp所指的網(wǎng)絡(luò)地址字符串轉(zhuǎn)換成網(wǎng)絡(luò)所使用的二進(jìn)制數(shù)字。網(wǎng)絡(luò)地址字符串是以數(shù)字和點(diǎn)組成的字符串,例女口16.1.1o.6返回值成功則返回對(duì)應(yīng)的網(wǎng)絡(luò)二進(jìn)制的數(shù)字,失敗返回-1。inet_aton(將網(wǎng)絡(luò)地址轉(zhuǎn)成網(wǎng)絡(luò)二進(jìn)制的數(shù)字)相關(guān)函數(shù)inet_addr,inet_ntoa表頭文件#includevsys/scoket.h#includevneti
16、net/in.h#includevarpa/inet.h定義函數(shù)intinet_aton(constchar*cp,structin_addr*inp);函數(shù)說(shuō)明inet_aton()用來(lái)將參數(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定義如下structin_addrunsignedlongints_addr;;返回值成功則返回非0值,失敗則返回0。inet_ntoa(將網(wǎng)絡(luò)二進(jìn)制的數(shù)字轉(zhuǎn)換成網(wǎng)絡(luò)地址)相關(guān)函數(shù)inet_addr,inet_aton表頭文件#includevsys/socket.h#includevn
17、etinet/in.h#includevarpa/inet.h定義函數(shù)char*inet_ntoa(structin_addrin);函數(shù)說(shuō)明inet_ntoa()用來(lái)將參數(shù)in所指的網(wǎng)絡(luò)二進(jìn)制的數(shù)字轉(zhuǎn)換成網(wǎng)絡(luò)地址,然后將指向此網(wǎng)絡(luò)地址字符串的指針?lè)祷?。返回值成功則返回字符串指針,失敗則返回NULL。listen(等待連接)相關(guān)函數(shù)socket,bind,accept,connect表頭文件#includevsys/socket.h定義函數(shù)intlisten(ints,intbacklog);函數(shù)說(shuō)listen()用來(lái)等待參數(shù)s的socket連線。參數(shù)backlog指定同時(shí)明能處理的最大連接要
18、求,如果連接數(shù)目達(dá)此上限則client端將收到ECONNREFUSED的錯(cuò)誤。Listen()并未開(kāi)始接收連線,只是設(shè)置socket為listen模式,真正接收client端連線的是accept。通常listen()會(huì)在socket。,bind()之后調(diào)用,接著才調(diào)用accept。返回值成功則返回0,失敗返回-1,錯(cuò)誤原因存于errno附加說(shuō)明listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數(shù)backlog最大值可設(shè)至128。錯(cuò)誤代碼EBADF參數(shù)sockfd非合法socket處理代碼EACCESS權(quán)限不足EOP
19、NOTSUPP指定的socket并未支援listen模式。范例#includevsys/types.h#includevsys/socket.h#includevnetinet/in.h#includevarpa/inet.h#includevunistd.h#definePORT1234#defineMAXSOCKFD10main()intsockfd,newsockfd,is_connectedMAXSOCKFD,fd;structsockaddr_inaddr;intaddr_len=sizeof(structsockaddr_in);fd_setreadfds;charbuffer25
20、6;charmsg=elcometoserer;if(sockfd=socket(AF_INET,SOCK_STREAM,0)v0)perror(socket);exit(1);bzero(&addr,sizeof(addr);addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sockfd,&addr,sizeof(addr)vO)perror(connect);exit(1);if(listen(sockfd,3)v0)perror(listen);
21、exit(1);for(fd=0;fdvMAXSOCKFD;fd+)is_connectedfd=0;while(1)FD_ZERO(&readfds);FD_SET(sockfd,&readfds);for(fd=0;fdvMAXSOCKFD;fd+)if(is_connectedfd)FD_SET(fd,&readfds);if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL)continue;for(fd=0;fdvMAXSOCKFD;fd+)if(FD_ISSET(fd,&readfds)if(sockfd=fd)if(newsockfd=accep
22、t(sockfd,&addr,&addr_len)vO)perror(accept);write(newsockfd,msg,sizeof(msg);is_connectednewsockfd=1;printf(cnnectfromn,inet_ntoa(addr.sin_addr);elsebzero(buffer,sizeof(buffer);if(read(fd,buffer,sizeof(buffer)定義函數(shù)unsignedlongintntohl(unsignedlongintnetlong);函數(shù)說(shuō)明ntohl()用來(lái)將參數(shù)指定的32位netlong轉(zhuǎn)換成主機(jī)字符順序。返回值返回
23、對(duì)應(yīng)的主機(jī)字符順序。范例參考getservent()。ntohs(將16位網(wǎng)絡(luò)字符順序轉(zhuǎn)換成主機(jī)字符順序)相關(guān)函數(shù)htonl,htons,ntohl表頭文件#ineludevnetinet/in.h定義函數(shù)unsignedshortintntohs(unsignedshortintnetshort);函數(shù)說(shuō)明ntohs()用來(lái)將參數(shù)指定的16位netshort轉(zhuǎn)換成主機(jī)字符順序。返回值返回對(duì)應(yīng)的主機(jī)順序。范例參考getservent()。recv(經(jīng)socket接收數(shù)據(jù))相關(guān)函數(shù)reevfrom,recvmsg,send,sendto,socket表頭文件#includevsys/types.
24、h#includevsys/socket.h定義函數(shù)intrecv(ints,void*buf,intlen,unsignedintflags);函數(shù)說(shuō)recv()用來(lái)接收遠(yuǎn)端主機(jī)經(jīng)指定的socket傳來(lái)的數(shù)據(jù),并把數(shù)據(jù)明存到由參數(shù)buf指向的內(nèi)存空間,參數(shù)len為可接收數(shù)據(jù)的最大長(zhǎng)度。參數(shù)flags一般設(shè)0。其他數(shù)值定義如下:及返回值MSG_OOB接收以out-of-band送出的數(shù)據(jù)。MSG_PEEK返回來(lái)的數(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此操作不愿
25、被SIGPIPE信號(hào)中斷返回值成功則返回接收到的字符數(shù),失敗返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代EBADF參數(shù)s非合法的socket處理代碼碼FAULT參數(shù)中有一指針指向無(wú)法存取的內(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表頭文件#includevsys
26、/types.h#includevsys/socket.h定義函數(shù)intrecvfrom(ints,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);函數(shù)說(shuō)recv()用來(lái)接收遠(yuǎn)程主機(jī)經(jīng)指定的socket傳來(lái)的數(shù)據(jù),并把數(shù)據(jù)明存到由參數(shù)buf指向的內(nèi)存空間,參數(shù)len為可接收數(shù)據(jù)的最大長(zhǎng)度。參數(shù)flags一般設(shè)0,其他數(shù)值定義請(qǐng)參考recv()。參數(shù)from用來(lái)指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)sockaddr請(qǐng)參考bind()。參數(shù)fromlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。返回值成功則返回接收到的字符數(shù),失敗則返回-
27、1,錯(cuò)誤原因存于errno中。錯(cuò)誤代EBADF參數(shù)s非合法的socket處理代碼碼EFAULT參數(shù)中有一指針指向無(wú)法存取的內(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ù)不正確。范例/*利用socket的UDPclient*此程序會(huì)連線UDPserver,并將鍵盤輸入的字符串傳給server。*UDPserver范例請(qǐng)參考sendto()。*/#includevsys/stat.h#includevfcn
28、tl.h#includevunistd.h#includevsys/typs.h#includevsys/socket.h#includevnetinet/in.h#includevarpa/inet.h#definePORT2345#defineRRP12.1main()ints,len;structsockaddr_inaddr;intaddr_len=sizeof(structsockaddr_in);charbuffer256;/*建立socket*/if(s=socket(AF_INET,SOCK_DGRAM,0)vO)perror(socket);exit(1);/*填寫socka
29、ddr_in*/bzero(&addr,sizeof(addr);addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(SERVER_IP);while(1)bzero(buffer,sizeof(buffer);/*從標(biāo)準(zhǔn)輸入設(shè)備取得字符串*/len=read(STDIN_FILENO,buffer,sizeof(buffer);/*將字符串傳送給server端*/sendto(s,buffer,len,O,&addr,addr_len);/*接收server端返回的字符串*/len=
30、recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);printf(receives,buffer);執(zhí)行(先執(zhí)行udpserver再執(zhí)行udpclient)hello/*從鍵盤輸入字符串*/receive:hello/*server端返回來(lái)的字符串*/recvmsg(經(jīng)socket接收數(shù)據(jù))相關(guān)函數(shù)recv,recvfrom,send,sendto,sendmsg,socket表頭文件#includevsys/types.h#includevsys/socktet.h定義函數(shù)intrecvmsg(ints,structmsghdr*msg,u
31、nsignedintflags);函數(shù)說(shuō)明recvmsg()用來(lái)接收遠(yuǎn)程主機(jī)經(jīng)指定的socket傳來(lái)的數(shù)據(jù)。參數(shù)s為已建立好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過(guò)連線操作。參數(shù)msg指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,參數(shù)flags一般設(shè)0,詳細(xì)描述請(qǐng)參考send()。關(guān)于結(jié)構(gòu)msghdr的定義請(qǐng)參考sendmsg()。返回值成功則返回接收到的字符數(shù),失敗則返回-1,錯(cuò)誤原因存于errno中。錯(cuò)誤代碼EBADF參數(shù)s非合法的socket處理代碼。EFAULT參數(shù)中有一指針指向無(wú)法存取的內(nèi)存空間ENOTSOCK參數(shù)s為一文件描述詞,非socket。EINTR被信號(hào)所中斷。EAGAIN此操作會(huì)令進(jìn)
32、程阻斷,但參數(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表頭文#includevsys/types.h件#includevsys/socket.h定義函數(shù)intsend(ints,constvoid*msg,intlen,unsignedintfalgs);函數(shù)說(shuō)明send()用來(lái)將數(shù)據(jù)由指定的socket傳給對(duì)方主機(jī)。參數(shù)s為已建立好連接的socket。參數(shù)msg指向欲連線
33、的數(shù)據(jù)內(nèi)容,參數(shù)len則為數(shù)據(jù)長(zhǎng)度。參數(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ù)中有一指針指向無(wú)法存取的內(nèi)存空間ENOTSOCK參數(shù)s為一文件描述詞,非socket。EINTR被信號(hào)所中斷。EAGAIN此操作會(huì)令進(jìn)程阻斷,但參數(shù)s的socket為不可阻斷。ENOBU
34、FS系統(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表頭文件#includevsys/types.h#includevsys/socket.h定義函數(shù)intsendmsg(ints,conststrcutmsghdr*msg,unsignedintflags);函數(shù)說(shuō)sendmsg()用來(lái)將數(shù)據(jù)由指定的socket傳給對(duì)方主機(jī)。參數(shù)s為明已建立好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過(guò)連線操作。參數(shù)ms
35、g指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,參數(shù)flags一般默認(rèn)為0,詳細(xì)描述請(qǐng)參考send()。結(jié)構(gòu)msghdr定義如下structmsghdrvoid*msg_name;/*Addresstosendto/receivefrom.*/socklen_tmsg_namelen;/*Lengthofaddresdata*/strcutiovec*msg_iov;/*Vectorofdatatosend/receiveinto*/size_tmsg_iovlen;/*Numberofelementsinthevector*/void*msg_control;/*Ancillarydat*/size_tmsg_
36、controllen;/*Ancillarydatabufferlength*/intmsg_flags;/*Flagsonreceivedmessage*/;返回值成功則返回實(shí)際傳送出去的字符數(shù),失敗返回-1,錯(cuò)誤原因存于errno錯(cuò)誤代碼EBADF參數(shù)s非合法的socket處理代碼。EFAULT參數(shù)中有一指針指向無(wú)法存取的內(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()。
37、sendto(經(jīng)socket傳送數(shù)據(jù))相關(guān)函數(shù)send,sendmsg,recv,recvfrom,socket表頭文#include件#inelude定義函in數(shù)itsendto(ints,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);函數(shù)說(shuō)明sendto()用來(lái)將數(shù)據(jù)由指定的socket傳給對(duì)方主機(jī)。參數(shù)s為已建好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過(guò)連線操作。參數(shù)msg指向欲連線的數(shù)據(jù)內(nèi)容,參數(shù)flags一般設(shè)0,詳細(xì)描述請(qǐng)參考send()。參數(shù)to用來(lái)指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)so
38、ckaddr請(qǐng)參考bind()。參數(shù)tolen為sockaddr的結(jié)果長(zhǎng)度。返回值成功則返回實(shí)際傳送出去的字符數(shù),失敗返回一1錯(cuò)誤原因存于errno中。錯(cuò)誤代碼EBADF參數(shù)s非法的socket處理代碼。EFAULT參數(shù)中有一指針指向無(wú)法存取的內(nèi)存空間。WNOTSOCKcanshus為一文件描述詞,非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ù)不正確。范例#include#include#includevnetinet.in.h#includevarpa.inet.h#d
39、efinePORT2345/*使用的port*/main()intsockfd,len;structsockaddr_inaddr;charbuffer256;/*建立socket*/if(sockfd=socket(AF_INET,SOCK_DGRAM,0)vOperror(socket);exit(1);/*填寫sockaddr_in結(jié)構(gòu)*/bzero(&addr,sizeof(addr);addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr=hton1(INADDR_ANY);if(bind(sockfd,&add
40、r,sizeof(addr)定義函數(shù)voidsetprotoent(intstayopen);函數(shù)說(shuō)明setprotoent()用來(lái)打開(kāi)/etc/protocols,如果參數(shù)stayopen值為1則接下來(lái)的getprotobyname()或getprotobynumber()將不會(huì)自動(dòng)關(guān)閉此文件。setservent(打開(kāi)主機(jī)網(wǎng)絡(luò)服務(wù)的數(shù)據(jù)文件)相關(guān)函數(shù)getservent,getservbyname,getservbyport,endservent表頭文件#include定義函數(shù)voidsetservent(intstayopen);函數(shù)說(shuō)明setservent()用來(lái)打開(kāi)/etc/serv
41、ices,如果參數(shù)stayopen值為1則接下來(lái)的getservbyname()或getservbyport()將補(bǔ)回自動(dòng)關(guān)閉文件。setsockopt(設(shè)置socket狀態(tài))相關(guān)函數(shù)getsockopt表頭文件#include#includevsys/socket.h定義函數(shù)intsetsockopt(ints,intlevel,intoptname,constvoid*optvalsocklen_toptlen);函數(shù)說(shuō)明setsockopt()用來(lái)設(shè)置參數(shù)s所指定的socket狀態(tài)。參數(shù)level代表欲設(shè)置的網(wǎng)絡(luò)層,般設(shè)成SOL_SOCKET以存取socket層。參數(shù)optname代表欲
42、設(shè)置的選項(xiàng),有下列幾種數(shù)值:SO_DEBUG打開(kāi)或關(guān)閉排錯(cuò)模式SO_REUSEADDR允許在bind()過(guò)程中本地地址可重復(fù)使用SO_TYPE返回socket形態(tài)。SO_ERROR返回socket已發(fā)生的錯(cuò)誤原因SO_DONTROUTE送出的數(shù)據(jù)包不要利用路由設(shè)備來(lái)傳輸。SO_BROADCAST使用廣播方式傳送SO_SNDBUF設(shè)置送出的暫存區(qū)大小SO_RCVBUF設(shè)置接收的暫存區(qū)大小SO_KEEPALIVE定期確定連線是否已終止。SOOOBINLINE當(dāng)接收到00B數(shù)據(jù)時(shí)會(huì)馬上送至標(biāo)準(zhǔn)輸入設(shè)備SO_LINGER確保數(shù)據(jù)安全且可靠的傳送出去。參數(shù)optva1代表欲設(shè)置的值,參數(shù)optien則為optval的長(zhǎng)度。返回值成功則返回0若有錯(cuò)誤則返回-1,錯(cuò)誤原因存于errno。附加說(shuō)明EBADF參數(shù)s并非合法的socket處理代碼。ENOTSOCK參數(shù)s為一文件描述詞,非sock
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品監(jiān)制合同范本
- 企業(yè)商務(wù)合同范例
- 蘭州城鎮(zhèn)路燈合同范例
- 農(nóng)村個(gè)人修復(fù)寺廟合同范例
- 教育閱讀的愛(ài)與怕
- 企業(yè)消防維修合同范例
- 小學(xué)生肺結(jié)核的預(yù)防知識(shí)
- 價(jià)格磋商合同范例
- 秘書部的述職報(bào)告
- 創(chuàng)業(yè)項(xiàng)目中期報(bào)告
- GB/T 4154-1993氧化鑭
- 水泥混凝土路面試驗(yàn)檢測(cè)的要點(diǎn)
- 運(yùn)輸供應(yīng)商年度評(píng)價(jià)表
- 室內(nèi)消防及給排水管道安裝施工方案方案
- 無(wú)創(chuàng)呼吸機(jī)參數(shù)調(diào)節(jié)課件
- 《過(guò)零丁洋》公開(kāi)課件
- 文件傳閱單范本
- 電工培養(yǎng)計(jì)劃表
- 部編版五年級(jí)道德與法治下冊(cè)課程綱要
- Q∕SY 02006-2016 PVT取樣技術(shù)規(guī)程
- 初中物理公式MicrosoftWord文檔
評(píng)論
0/150
提交評(píng)論