39 网络相关函数(七)——live555源码阅读(四)网络

39 网络相关函数(七)——live555源码阅读(四)网络

  • 39 网络相关函数(七)——live555源码阅读(四)网络
    • 简介
    • 14)readSocket从套接口读取数据
    • recv/recvfrom 函数
      • 函数原型:
      • 参数说明:
      • 返回说明:

本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

简介

网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API相关函数,就不提了。
   这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
   这些方法大多在live555sourcecontrol\groupsock\include\GroupsockHelper.hh中声明。

14)readSocket从套接口读取数据

readSocket函数从套接口socket读取数据到buffer,并捕获数据发送源的地址到fromAddress
函数返回读取到的字节数,出错时返回0并调用socketErr(env, "recvfrom() error: ")来设置套接口错误消息。

// 从套接口读数据
int readSocket(UsageEnvironment& env,int socket, unsigned char* buffer, unsigned bufferSize,
struct sockaddr_in& fromAddress) {SOCKLEN_T addressSize = sizeof fromAddress;// ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);// 读取主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度。flag一般设置为0。from是来源地址,fromlen传出来源长度// 如果正确接收返回接收到的字节数,失败返回-1.int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0,(struct sockaddr*)&fromAddress,&addressSize);if (bytesRead < 0) {//##### HACK to work around bugs in Linux and Windows:int err = env.getErrno();if (err == 111 /*ECONNREFUSED (Linux) 连接请求被服务器拒绝*/
#if defined(__WIN32__) || defined(_WIN32)// What a piece of crap Windows is.  Sometimes// recvfrom() returns -1, but with an 'errno' of 0.// This appears not to be a real error; just treat// it as if it were a read of zero bytes, and hope// we don't have to do anything else to 'reset'// this alleged error:// 垃圾的Windows。有时recvfrom()返回- 1,但是有errno为0。// 这似乎不是一个真正的错误;只是把它当作一个读取零字节,并希望我们不需要做什么“reset”// 这所谓的错误:|| err == 0 || err == EWOULDBLOCK
#else|| err == EAGAIN
#endif|| err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return this for datagram sock?fromAddress.sin_addr.s_addr = 0;return 0;}//##### END HACKsocketErr(env, "recvfrom() error: ");}return bytesRead;
}

recv/recvfrom 函数

功能描述:
从套接字上接收一个消息。对于recvfrom,可同时应用于面向接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第个参数设置NULL
如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃
假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。

函数原型:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sock, void *buf, size_t len, int flags);
ssize_t recvfrom(int sock, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);

参数说明:

  • sock:索引将要从其接收数据的套接字。
  • buf:存放消息接收后的缓冲区。
  • len:buf所指缓冲区的容量。
  • flags:是以下一个或者多个标志的组合体,可通过or操作连在一起
    MSG_DONTWAIT:操作不会被阻塞。
    MSG_ERRQUEUE:指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来,使用者应该提供足够大的缓冲区。导致错误的原封包通过msg_iovec作为一般的数据来传递。导致错误的数据报原目标地址作为msg_name被提供。错误以sock_extended_err结构形态被使用,定义如下
#define SO_EE_ORIGIN_NONE    0
#define SO_EE_ORIGIN_LOCAL   1
#define SO_EE_ORIGIN_ICMP    2
#define SO_EE_ORIGIN_ICMP6   3
struct sock_extended_err
{u_int32_t ee_errno;   /* error number */u_int8_t ee_origin; /* where the error originated */u_int8_t ee_type;    /* type */u_int8_t ee_code;    /* code */u_int8_t ee_pad;u_int32_t ee_info;    /* additional information */u_int32_t ee_data;    /* other data *//* More data may follow */
};
说明
MSG_PEEK指示数据接收后,在接收队列中保留原数据,不将其删除,随后的读操作还可以接收相同的数据。
MSG_TRUNC返回封包的实际长度,即使它比所提供的缓冲区更长, 只对packet套接字有效。
MSG_WAITALL要求阻塞操作,直到请求得到完整的满足。然而,如果捕捉到信号,错误或者连接断开发生,或者下次被接收的数据类型不同,仍会返回少于请求量的数据。
MSG_EOR指示记录的结束,返回的数据完成一个记录。
MSG_TRUNC指明数据报尾部数据已被丢弃,因为它比所提供的缓冲区需要更多的空间。
MSG_CTRUNC指明由于缓冲区空间不足,一些控制数据已被丢弃。
MSG_OOB指示接收到out-of-band数据(即需要优先处理的数据)。
MSG_ERRQUEUE指示除了来自套接字错误队列的错误外,没有接收到其它数据。
  • from:指向存放对端地址的区域,如果为NULL,不储存对端地址。
  • fromlen:作为入口参数,指向存放表示from最大容量的内存单元。作为出口参数,指向存放表示from实际长度的内存单元。

返回说明:

成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1errno被设为以下的某个值

  • EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
  • EBADF:sock不是有效的描述词
  • ECONNREFUSE:远程主机阻绝网络连接
  • EFAULT:内存空间访问出错
  • EINTR:操作被信号中断
  • EINVAL:参数无效
  • ENOMEM:内存不足
  • ENOTCONN:与面向连接关联的套接字尚未被连接上
  • ENOTSOCK:sock索引的不是套接字

转载于:https://www.cnblogs.com/oloroso/p/4736913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年前端招聘技术概览

学习当下前端技术最好的方法就是从求职网站上找出前端的招聘要求&#xff0c;因为前端技术每年变化都很快&#xff0c;每个阶段都会不一样&#xff0c;这里简单从网站招聘要求罗列&#xff0c;仅供参考。更有针对性的是针对每个公司的招聘要求写简历&#xff0c;学习相关技术&a…

jexboss工具 -- JBOSS未授权访问漏洞利用

其实所有的节日&#xff0c;都不是为了礼物和红包而生&#xff0c;而是提醒我们不要忘记爱与被爱&#xff0c;生活需要仪式感&#xff0c;而你需要的是在乎和关爱。。。 ---- 网易云热评 小受&#xff1a;Ubuntu20 小攻&#xff1a;Kali2020 一、搭建该漏洞环境 查看上一篇文章…

sublime text 3 前端开发常用插件

sublime text 3 前端开发常用插件https://packagecontrol.io/browse 代码对齐:Alignmenthtml代码补全: EmmetCoffeeScript语法: Better CoffeeScriptcss格式化: CSS Formatless语法: LESSjs代码格式化:JsFormat代码注释文档: DocBlockr代码美化: HTML-CSS-JS Prettify 去除行尾…

前端工程师有哪些面试技巧值得掌握?

这段时间受到疫情的影响&#xff0c;本身做java开发的&#xff0c;面试了入职了一个外包公司的前端岗位&#xff0c;入职属于驻场开发的那种&#xff0c;前几周基本没啥事&#xff0c;一般经理会让你刷题&#xff0c;到了驻场那边需要机试过关才能在那边开发&#xff0c;这边在…

java 模块化_Java模块化方法–模块,模块,模块

java 模块化我想每个人都会同意&#xff0c;编写模块化应用程序和模块化通常是一件好事。 但是&#xff0c;从Java和Scala语言以及各种Java / Scala框架来看&#xff0c;对模块化的支持看起来如何&#xff1f; 有很多不同的方法&#xff01; 让我们看看其中的一些。 “保护”以…

Fastjson批量检查及一键利用工具

0x01 序章 上次讲解过手动利用fastjson&#xff0c;但讲的过于太简单了。根据大家的反应&#xff0c;收集如下几个问题。 1、如何盲打fastjson 2、判断fastjson的指纹 3、各版本payload以及使用ldap模式监听。 下面我就一一解答&#xff0c;我只是把我在网上查到的资料消化 后分…

动态规划--重拾我的“背包”

前言&#xff1a; 背包问题所涉及的是经典的动态规划算法。因为长时间不AC了&#xff0c;渐渐感觉思维也都麻了&#xff01;本文将基础的背包问题做个小结&#xff0c;方便以后翻阅。感兴趣的朋友也可以阅读一下~------------------------&#xff08;1&#xff09;如何从n个重…

CSS3学习笔记总结,你值得拥有(呕心沥血之作,涵盖CSS3所有知识点)

目录 简介 边框 圆角 背景 渐变 文本效果 字体 2D转换 3D转换

Java 8 SE可选,严格的方法

大约两周前&#xff0c;Stephen Colebourne提出了使用Optional的实用方法 。 如果您阅读了它&#xff0c;您可能会从我以前的建议中猜到我不同意。 总览 我必须以免责声明开头&#xff0c;但随后我将直接解释为什么我认为他的方法不够理想。 所有不归因于他人的报价均摘自Ste…

routersploit简单实例

https://github.com/reverse-shell/routersploit RouterSploit。它包含了27个品牌的上百种漏洞利用模块&#xff0c;涉及的路由器、摄像头等设备有几百种。渗透的时候&#xff0c;用户首先根据目标设备的品牌选择对应的扫描模块&#xff0c;用以发现漏洞。一旦漏洞识别&#x…

《Spring3.0就这么简单》

第一章 认识Spring 1、Spring提供的IOC容器&#xff0c;是Spring大杀器之一。容器将对象之间的依赖关系交给Spring进行控制&#xff0c;采用配制的方式对依赖关系进行描述&#xff0c;由Ioc容器负责依赖类之间的创建、拼接、管理、获取工作 2、Spring提供的第二大杀器&#xff…

前端面试题之http/HTML/浏览器(一)

1.cookie sessionStorage localStorage区别&#xff1f;答&#xff1a;cookie数据始终在同源的http请求中携带(即使不需要)&#xff0c;即cookie在浏览器和服务器间来回传递cookie数据还有路径&#xff08;path&#xff09;的概念&#xff0c;可以限制。cookie只属于某个路径下…

[Vulhub](WooYun-2016-199433)phpmyadmin反序列化漏洞

0x00 预备知识 什么是序列化 序列化 (serialize)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区。以后&#xff0c;可以通过从存储区中读取或反序列化对象的状态&#xff0c;重新创建该对象。【将状…

用户指南接口

在AppDelegate在代码 视图控制器里的 版权声明&#xff1a;本文博客原创文章。博客&#xff0c;未经同意&#xff0c;不得转载。 转载于:https://www.cnblogs.com/bhlsheji/p/4747547.html

前端面试题之http/HTML/浏览器(二)

csrf和xss的网络攻击及防范&#xff1f;答&#xff1a;CSRF&#xff1a;跨站请求伪造&#xff0c;可以理解为攻击者盗用了用户的身份&#xff0c;以用户的名义发送了恶意请求&#xff0c;比如用户登录了一个网站后&#xff0c;立刻在另一个&#xff54;&#xff41;&#xff42…

使用Spring Cloud休息客户电话

使用Spring-Cloud项目进行REST客户端调用有几种有趣的方法。 Spring-Cloud REST支持建立在核心Netflix OSS库的基础上&#xff0c;但将它们抽象化并在此过程中简化了库的使用。 RestTemplate 首先&#xff0c;让我们考虑使用RestTemplate通过基于Spring的应用程序进行Rest调用…

查看目标主机安装的杀毒软件

命令&#xff1a; wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe 参考链接&#xff1a;https://stackoverflow.com/questions/42472336/is-there-a-command-to-check-if-there-was-any-antivirus-insta…

Netty系列之Netty百万级推送服务设计要点

原文&#xff1a;http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我&#xff0c;咨询推送服务相关的问题。问题五花八门&#xff0c;在帮助大家答疑…

上架APPStore需要准备哪些材料?

前端时间用敏捷式开发平台开发了一款APP应用&#xff0c;应用名称我就不说啦&#xff0c;这篇文章主要讲述一下上架苹果应用商店APPStore需要准备哪些材料&#xff0c;有相关的困扰欢迎私信我。一、上架流程1. 注册苹果企业账号2. 创建测试证书&#xff0c;发布证书 (使用Mac)3…

浅谈C++设计模式之工厂方法(Factory Method)

为什么要用设计模式&#xff1f;根本原因是为了代码复用&#xff0c;增加可维护性。 面向对象设计坚持的原则&#xff1a;开闭原则&#xff08;Open Closed Principle&#xff0c;OCP&#xff09;、里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&…