国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

2020-01-26 14:54:20
字體:
供稿:網(wǎng)友

recv()函數(shù):
頭文件:

#include <sys/types.h>  #include <sys/socket.h>

定義函數(shù):

int recv(int s, void *buf, int len, unsigned int flags);

函數(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ù)值定義如下:
1、MSG_OOB 接收以out-of-band 送出的數(shù)據(jù).
2、MSG_PEEK 返回來的數(shù)據(jù)并不會(huì)在系統(tǒng)內(nèi)刪除, 如果再調(diào)用recv()會(huì)返回相同的數(shù)據(jù)內(nèi)容.
3、MSG_WAITALL 強(qiáng)迫接收到len 大小的數(shù)據(jù)后才能返回, 除非有錯(cuò)誤或信號(hào)產(chǎn)生.
4、MSG_NOSIGNAL 此操作不愿被SIGPIPE 信號(hào)中斷返回值成功則返回接收到的字符數(shù), 失敗返回-1,錯(cuò)誤原因存于errno 中.

錯(cuò)誤代碼:
   EBADF 參數(shù)s 非合法的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ù)不正確.

recvfrom()函數(shù):
頭文件:

#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ù)說明:recv()用來接收遠(yuǎn)程主機(jī)經(jīng)指定的socket 傳來的數(shù)據(jù), 并把數(shù)據(jù)存到由參數(shù)buf 指向的內(nèi)存空間, 參數(shù)len 為可接收數(shù)據(jù)的最大長度. 參數(shù)flags 一般設(shè)0, 其他數(shù)值定義請(qǐng)參考recv(). 參數(shù)from 用來指定欲傳送的網(wǎng)絡(luò)地址, 結(jié)構(gòu)sockaddr 請(qǐng)參考bind(). 參數(shù)fromlen 為sockaddr 的結(jié)構(gòu)長度.

返回值:成功則返回接收到的字符數(shù), 失敗則返回-1, 錯(cuò)誤原因存于errno 中.

錯(cuò)誤代碼:
   EBADF 參數(shù)s 非合法的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ù)不正確.

范例:
/*利用socket 的UDP client此程序會(huì)連線UDP server, 并將鍵盤輸入的字符串傳給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);  }  //填寫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 //從鍵盤輸入字符串receive: hello //server 端返回來的字符串

recvmsg()函數(shù):
頭文件:

#include <sys/types.h>  #include <sys/socktet.h>

定義函數(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ì)描述請(qǐng)參考send(). 關(guān)于結(jié)構(gòu)msghdr 的定義請(qǐng)參考sendmsg().

返回值:成功則返回接收到的字符數(shù), 失敗則返回-1, 錯(cuò)誤原因存于errno 中.

錯(cuò)誤代碼:
   EBADF 參數(shù)s 非合法的socket 處理代碼.
   EFAULT 參數(shù)中有一指針指向無法存取的內(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ù)不正確.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 武威市| 饶河县| 武定县| 皋兰县| 疏勒县| 西丰县| 无棣县| 高密市| 黔西| 和硕县| 齐河县| 双牌县| 华坪县| 灵宝市| 江都市| 湖南省| 阿尔山市| 孟村| 信阳市| 璧山县| 沁水县| 桂阳县| 达州市| 贵德县| 康乐县| 清河县| 涿州市| 吉隆县| 津市市| 宁安市| 即墨市| 阿克陶县| 江永县| 容城县| 兰坪| 土默特右旗| 平潭县| 陆丰市| 荥经县| 衡南县| 济源市|