生活随笔
收集整理的這篇文章主要介紹了
Linux下Socket 函数集(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
| ntohl(將32位網絡字符順序轉換成主機字符順序) | | 相關函數 | htonl,htons,ntohs | | 表頭文件 | #include<netinet/in.h> | | 定義函數 | unsigned long int ntohl(unsigned long int netlong); | | 函數說明 | ntohl()用來將參數指定的32位netlong轉換成主機字符順序。 | | 返回值 | 返回對應的主機字符順序。 | | 范例 | 參考getservent()。 |
|
| ntohs(將16位網絡字符順序轉換成主機字符順序) | | 相關函數 | htonl,htons,ntohl | | 表頭文件 | #include<netinet/in.h> | | 定義函數 | unsigned short int ntohs(unsigned short int netshort); | | 函數說明 | ntohs()用來將參數指定的16位netshort轉換成主機字符順序。 | | 返回值 | 返回對應的主機順序。 | | 范例 | 參考getservent()。 |
|
| recv(經socket接收數據) | | 相關函數 | recvfrom,recvmsg,send,sendto,socket | | 表頭文件 | #include<sys/types.h> #include<sys/socket.h> | | 定義函數 | int recv(int s,void *buf, int len, unsigned int flags); | | 函數說明 | recv()用來接收遠端主機經指定的socket傳來的數據,并把數據存到由參數buf?指向的內存空間,參數len為可接收數據的最大長度。 | | 參數 及 返回值 | flags一般設0。其他數值定義如下: MSG_OOB接收以out-of-band?送出的數據。 MSG_PEEK返回來的數據并不會在系統內刪除,如果再調用recv()會返回相同的數據內容。 MSG_WAITALL強迫接收到len大小的數據后才能返回,除非有錯誤或信號產生。 MSG_NOSIGNAL此操作不愿被SIGPIPE信號中斷返回值成功則返回接收到的字符數,失敗返回-1,錯誤原因存于errno中。 | | 錯誤代碼 | EBADF參數s非合法的socket處理代碼 FAULT參數中有一指針指向無法存取的內存空間 ENOTSOCK參數s為一文件描述詞,非socket。 EINTR被信號所中斷 EAGAIN此動作會令進程阻斷,但參數s的socket為不可阻斷 ENOBUFS系統的緩沖內存不足。 ENOMEM核心內存不足 EINVAL傳給系統調用的參數不正確。 | | 范例 | 參考listen()。 |
|
| recvfrom(經socket接收數據) | | 相關函數 | recv,recvmsg,send,sendto,socket | | 表頭文件 | #include<sys/types.h> #include<sys/socket.h> | | 定義函數 | int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen); | | 函數說明 | recv()用來接收遠程主機經指定的socket?傳來的數據,并把數據存到由參數buf?指向的內存空間,參數len?為可接收數據的最大長度。參數flags?一般設0,其他數值定義請參考recv()。參數from用來指定欲傳送的網絡地址,結構sockaddr?請參考bind()。參數fromlen為sockaddr的結構長度。 | | 返回值 | 成功則返回接收到的字符數,失敗則返回-1,錯誤原因存于errno中。 | | 錯誤代碼 | EBADF參數s非合法的socket處理代碼 EFAULT參數中有一指針指向無法存取的內存空間。 ENOTSOCK參數s為一文件描述詞,非socket。 EINTR被信號所中斷。 EAGAIN此動作會令進程阻斷,但參數s的socket為不可阻斷。 ENOBUFS系統的緩沖內存不足 ENOMEM核心內存不足 EINVAL傳給系統調用的參數不正確。 | | 范例 | /*利用socket的UDP client *?此程序會連線UDP server,并將鍵盤輸入的字符串傳給server。 * UDP server?范例請參考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); } /*?填寫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)); /*?從標準輸入設備取得字符串*/ 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); } } | | 執行 | (先執行udp server?再執行udp client) hello /*從鍵盤輸入字符串*/ receive: hello /*server端返回來的字符串*/ |
|
| recvmsg(經socket接收數據) | | 相關函數 | recv,recvfrom,send,sendto,sendmsg,socket | | 表頭文件 | #include<sys/types.h> #include<sys/socktet.h> | | 定義函數 | int recvmsg(int s,struct msghdr *msg,unsigned int flags); | | 函數說明 | recvmsg()用來接收遠程主機經指定的socket傳來的數據。參數s為已建立好連線的socket,如果利用UDP協議則不需經過連線操作。參數msg指向欲連線的數據結構內容,參數flags一般設0,詳細描述請參考send()。關于結構msghdr的定義請參考sendmsg()。 | | 返回值 | 成功則返回接收到的字符數,失敗則返回-1,錯誤原因存于errno中。 | | 錯誤代碼 | EBADF參數s非合法的socket處理代碼。 EFAULT參數中有一指針指向無法存取的內存空間 ENOTSOCK參數s為一文件描述詞,非socket。 EINTR被信號所中斷。 EAGAIN此操作會令進程阻斷,但參數s的socket為不可阻斷。 ENOBUFS系統的緩沖內存不足 ENOMEM核心內存不足 EINVAL傳給系統調用的參數不正確。 | | 范例 | 參考recvfrom()。 |
|
| |
| ? |
| ? |
| ? |
| ? |
| ? |
| ? |
| ? |
轉載于:https://blog.51cto.com/yiluohuanghun/950653
總結
以上是生活随笔為你收集整理的Linux下Socket 函数集(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。