程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話中經socket吸收數據的相干函數詳解

C說話中經socket吸收數據的相干函數詳解

編輯:關於C++

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 傳給體系挪用的參數不准確.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved