欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年09月06日 10:37:05   投稿:goldensun  
這篇文章主要介紹了C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解,分別為recv()函數(shù)和recvfrom()函數(shù)以及recvmsg()函數(shù)的使用,需要的朋友可以參考下

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ù)不正確.

相關(guān)文章

  • VS2019配置BOOST的方法(v1.70.0庫)

    VS2019配置BOOST的方法(v1.70.0庫)

    這篇文章主要介紹了VS2019配置BOOST的方法(v1.70.0庫),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 深入理解memmove()與memcpy()的區(qū)別以及實(shí)現(xiàn)方法

    深入理解memmove()與memcpy()的區(qū)別以及實(shí)現(xiàn)方法

    本篇文章是對(duì)memmove()與memcpy()的區(qū)別以及實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言驅(qū)動(dòng)開發(fā)之內(nèi)核文件的讀寫

    C語言驅(qū)動(dòng)開發(fā)之內(nèi)核文件的讀寫

    這篇文章主要為大家詳細(xì)介紹了C語言驅(qū)動(dòng)開發(fā)中內(nèi)核文件的讀寫的系列函數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • C++11中std::future的具體使用方法

    C++11中std::future的具體使用方法

    這篇文章主要介紹了C++11中std::future的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C++讀取配置文件的示例代碼

    C++讀取配置文件的示例代碼

    這篇文章主要介紹了C++讀取配置文件的示例代碼,幫助大家更好的理解和學(xué)習(xí)C++開發(fā),感興趣的朋友可以了解下
    2020-08-08
  • VScode中添加頭文件和源文件(C/C++)的方法

    VScode中添加頭文件和源文件(C/C++)的方法

    使用VSCode編譯C/C++時(shí),會(huì)存在找不到頭文件的情況,下面這篇文章主要給大家介紹了關(guān)于VScode中添加頭文件和源文件(C/C++)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C語言中各種運(yùn)算類型全面總結(jié)

    C語言中各種運(yùn)算類型全面總結(jié)

    C語言運(yùn)算符是說明特定操作的符號(hào),它是構(gòu)造C語言表達(dá)式的工具,C語言的運(yùn)算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運(yùn)算符處理
    2022-04-04
  • C語言模擬實(shí)現(xiàn)簡單掃雷游戲

    C語言模擬實(shí)現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言模擬實(shí)現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)

    C語言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)

    C語言只有在定義字符數(shù)組的時(shí)候才能用“=”來初始化變量,其它情況下是不能直接用“=”來為字符數(shù)組賦值的,下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體數(shù)組常用的三種賦值方法,需要的朋友可以參考下
    2022-06-06
  • C/C++模擬實(shí)現(xiàn)煙花效果的示例代碼

    C/C++模擬實(shí)現(xiàn)煙花效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++模擬實(shí)現(xiàn)煙花效果的兩種簡單方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01

最新評(píng)論