• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中经socket接收数据的相关函数详解

C语言中经socket接收数据的相关函数详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了中经商品交易中心,中经商品交易所官网,中经商品交易中心官网,中经商品交易所,中经网等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

recv()函数:
头文件:

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

定义函数:

int recv(int s, void *buf, int len, unsigned int flags);
</div>

函数说明: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>
</div>

定义函数:

int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,int *fromlen);
</div>

函数说明: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);
  }
}
</div>

执行(先执行udp server 再执行udp client):

hello //从键盘输入字符串
receive: hello //server 端返回来的字符串
</div>

recvmsg()函数:
头文件:

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

定义函数:

int recvmsg(int s, struct msghdr *msg, unsigned int flags);
</div>

函数说明: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 传给系统调用的参数不正确.

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中经socket接收数据的相关函数详解

相关文章

  • 2017-05-28C++并查集亲戚(Relations)算法实例
  • 2017-05-28浅谈防不胜防的unsigned int的运算
  • 2017-05-28c++中容器之总结篇
  • 2017-05-28简单分析针对ARM平台的C语言程序的编译问题
  • 2017-05-28OLEDB打开Excel文件的实现方法
  • 2017-05-28c++中数字与字符串之间的转换方法(推荐)
  • 2017-05-28C++中汉字字符串的截取
  • 2017-05-28Cocos2d-x触摸事件实例
  • 2017-05-28C++操作SQLite简明教程
  • 2017-05-28C语言的Struct Hack笔记

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈c++ stl迭代器失效的问题
    • C语言 字符串首字母转换成大写简单实例
    • 使用opencv把图片拼接成视频
    • 详解 linux c++的编译器g++的基本使用
    • 基于malloc与free函数的实现代码及分析
    • 基于C语言实现简单的走迷宫游戏
    • Python HTTP服务搭建显示本地文件
    • 使用C语言求二叉树结点的最低公共祖先的方法
    • 指向变量的常指针与指向常变量的指针详细解析
    • 使用VS2010创建MFC ActiveX工程项目

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有