生活随笔
收集整理的這篇文章主要介紹了
Linux下Socket 函数集(三)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
| ntohl(將32位網(wǎng)絡(luò)字符順序轉(zhuǎn)換成主機(jī)字符順序) | | 相關(guān)函數(shù) | htonl,htons,ntohs | | 表頭文件 | #include<netinet/in.h> | | 定義函數(shù) | unsigned long int ntohl(unsigned long int netlong); | | 函數(shù)說(shuō)明 | ntohl()用來(lái)將參數(shù)指定的32位netlong轉(zhuǎn)換成主機(jī)字符順序。 | | 返回值 | 返回對(duì)應(yīng)的主機(jī)字符順序。 | | 范例 | 參考getservent()。 |
|
| ntohs(將16位網(wǎng)絡(luò)字符順序轉(zhuǎn)換成主機(jī)字符順序) | | 相關(guān)函數(shù) | htonl,htons,ntohl | | 表頭文件 | #include<netinet/in.h> | | 定義函數(shù) | unsigned short int ntohs(unsigned short int netshort); | | 函數(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ù) | recvfrom,recvmsg,send,sendto,socket | | 表頭文件 | #include<sys/types.h> #include<sys/socket.h> | | 定義函數(shù) | int recv(int s,void *buf, int len, unsigned int flags); | | 函數(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此操作不愿被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 | | 表頭文件 | #include<sys/types.h> #include<sys/socket.h> | | 定義函數(shù) | int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *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ù),失敗則返回-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的UDP client *?此程序會(huì)連線UDP server,并將鍵盤(pán)輸入的字符串傳給server。 * UDP server?范例請(qǐng)參考sendto()。 */ #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<sys/typs.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define PORT 2345 #define SERVER_IP “127.0.0.1” main() { int s,len; struct sockaddr_in addr; int addr_len =sizeof(struct sockaddr_in); char buffer[256]; /*?建立socket*/ if ((s = socket(AF_INET,SOCK_DGRAM,0))<0) { perror(“socket”); exit(1); } /*?填寫(xiě)sockaddr_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,0,&addr,addr_len); /*?接收server端返回的字符串*/ len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len); printf(“receive: %s”,buffer); } } | | 執(zhí)行 | (先執(zhí)行udp server?再執(zhí)行udp client) hello /*從鍵盤(pán)輸入字符串*/ receive: hello /*server端返回來(lái)的字符串*/ |
|
| recvmsg(經(jīng)socket接收數(shù)據(jù)) | | 相關(guān)函數(shù) | recv,recvfrom,send,sendto,sendmsg,socket | | 表頭文件 | #include<sys/types.h> #include<sys/socktet.h> | | 定義函數(shù) | int recvmsg(int s,struct msghdr *msg,unsigned int flags); | | 函數(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)程阻斷,但參數(shù)s的socket為不可阻斷。 ENOBUFS系統(tǒng)的緩沖內(nèi)存不足 ENOMEM核心內(nèi)存不足 EINVAL傳給系統(tǒng)調(diào)用的參數(shù)不正確。 | | 范例 | 參考recvfrom()。 |
|
| |
| ? |
| ? |
| ? |
| ? |
| ? |
| ? |
| ? |
轉(zhuǎn)載于:https://blog.51cto.com/yiluohuanghun/950653
總結(jié)
以上是生活随笔為你收集整理的Linux下Socket 函数集(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。