C說話中經socket吸收數據的相干函數詳解。本站提示廣大學習愛好者:(C說話中經socket吸收數據的相干函數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中經socket吸收數據的相干函數詳解正文
recv()函數:
頭文件:
#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. 其他數值界說以下:
1、MSG_OOB 吸收以out-of-band 送出的數據.
2、MSG_PEEK 前往來的數據其實不會在體系內刪除, 假如再挪用recv()會前往雷同的數據內容.
3、MSG_WAITALL 強制吸收到len 年夜小的數據後能力前往, 除非有毛病或旌旗燈號發生.
4、MSG_NOSIGNAL 此操作不肯被SIGPIPE 旌旗燈號中止前往值勝利則前往吸收到的字符數, 掉敗前往-1,毛病緣由存於errno 中.
毛病代碼:
EBADF 參數s 非正當的socket 處置代碼
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s 為一文件描寫詞, 非socket.
EINTR 被旌旗燈號所中止
EAGAIN 此舉措會令過程阻斷, 但參數s 的socket 為弗成阻斷
ENOBUFS 體系的緩沖內存缺乏.
ENOMEM 焦點內存缺乏
EINVAL 傳給體系挪用的參數不准確.
recvfrom()函數:
頭文件:
#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()函數:
頭文件:
#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 傳給體系挪用的參數不准確.