雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

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

錯誤代碼:
   EBADF 參數(shù)s 非合法的socket 處理代碼
   EFAULT 參數(shù)中有一指針指向無法存取的內(nèi)存空間
   ENOTSOCK 參數(shù)s 為一文件描述詞, 非socket.
   EINTR 被信號所中斷
   EAGAIN 此動作會令進程阻斷, 但參數(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īng)指定的socket 傳來的數(shù)據(jù), 并把數(shù)據(jù)存到由參數(shù)buf 指向的內(nèi)存空間, 參數(shù)len 為可接收數(shù)據(jù)的最大長度. 參數(shù)flags 一般設(shè)0, 其他數(shù)值定義請參考recv(). 參數(shù)from 用來指定欲傳送的網(wǎng)絡(luò)地址, 結(jié)構(gòu)sockaddr 請參考bind(). 參數(shù)fromlen 為sockaddr 的結(jié)構(gòu)長度.

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

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

范例:
/*利用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));
    //從標(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ī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ì)描述請參考send(). 關(guān)于結(jié)構(gòu)msghdr 的定義請參考sendmsg().

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

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

上一篇:C++條件語句和條件運算符的使用方法講解

欄    目:C語言

下一篇:詳解C++編程中運算符的使用

本文標(biāo)題:C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2763.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有