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

C語言中經socket接收數據的相關函數詳解

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

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 返回來的數據并不會在系統(tǒng)內刪除, 如果再調用recv()會返回相同的數據內容.
3、MSG_WAITALL 強迫接收到len 大小的數據后才能返回, 除非有錯誤或信號產生.
4、MSG_NOSIGNAL 此操作不愿被SIGPIPE 信號中斷返回值成功則返回接收到的字符數, 失敗返回-1,錯誤原因存于errno 中.

錯誤代碼:
   EBADF 參數s 非合法的socket 處理代碼
   EFAULT 參數中有一指針指向無法存取的內存空間
   ENOTSOCK 參數s 為一文件描述詞, 非socket.
   EINTR 被信號所中斷
   EAGAIN 此動作會令進程阻斷, 但參數s 的socket 為不可阻斷
   ENOBUFS 系統(tǒng)的緩沖內存不足.
   ENOMEM 核心內存不足
   EINVAL 傳給系統(tǒng)調用的參數不正確.

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 系統(tǒng)的緩沖內存不足
   ENOMEM 核心內存不足
   EINVAL 傳給系統(tǒng)調用的參數不正確.

范例:
/*利用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);
  }
}

執(zhí)行(先執(zhí)行udp server 再執(zhí)行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 系統(tǒng)的緩沖內存不足
   ENOMEM 核心內存不足
   EINVAL 傳給系統(tǒng)調用的參數不正確.

相關文章

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

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

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

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

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

    C語言驅動開發(fā)之內核文件的讀寫

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

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

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

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

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

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

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

    C語言中各種運算類型全面總結

    C語言運算符是說明特定操作的符號,它是構造C語言表達式的工具,C語言的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算符處理
    2022-04-04
  • C語言模擬實現簡單掃雷游戲

    C語言模擬實現簡單掃雷游戲

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

    C語言結構體數組常用的三種賦值方法(包含字符串)

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

    C/C++模擬實現煙花效果的示例代碼

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

最新評論