linux recv返回值,recv recvfrom[通俗易懂]

linux recv返回值,recv recvfrom[通俗易懂]recv和recvfrom都是用来接受来自的网络的数据。来看看它们的原型:intrecv(SOCKET,charFAR*,int,int);intrecvfrom(SOCKET,charFAR*,int,int,structsockaddrFAR*,intFAR*);这是在windows下面的定义。在linux下面的定义只是将SOCKET改成int,那么在linux下面的原型是这样:…

大家好,又见面了,我是你们的朋友全栈君。

recv和recvfrom都是用来接受来自的网络的数据。来看看它们的原型:

int recv(

SOCKET,

char FAR*,

int,

int

);

int recvfrom(

SOCKET,

char FAR*,

int,

int,

struct sockaddr FAR*,

int FAR*

);

这是在windows下面的定义。在linux下面的定义只是将SOCKET改成int,那么在linux下面的原型是这样:

int recv(

int,

char FAR*,

int,

int

);

int recvfrom(

int,

char FAR*,

int,

int,

struct sockaddr FAR*,

int FAR*

);

其实要是看看windows中SOCKET的定义,就知道它们几乎是完全相同了,为什么是几乎?因为还是有点小区别,linux下面是int类型,而windows下面是unsigned int。下面就是windows中SOCKET的定义:

typedef UINT_PTR        SOCKET;

typedef unsigned int UINT_PTR, *PUINT_PTR;

插一句,在linux下面这里的int s, 其实代表的是文件描述符。在linux中所有的设备,如磁盘,光驱,U盘甚至我们这里的讨论的网络也都被看作是文件。

我们看看这两个函数在功用上的共同点和不同点:

共同点:

1. 都是用来接受来自网络的数据

2. 都可以 接受面向连接的流式套接字的 和 接受无连接的数据报套接字 的数据

3. 在成功接受到数据后,返回值都是实际接受的字节数; 套接字关闭时,返回都为0; 接受出错时,windows下面都返回SOCKET_ERROR , linux下面都返回-1, 其实你要是感兴趣可以查看SOCKET_ERROR 定义,它的值也是-1;

关于这里的“套接字关闭”需要注意,2个函数在用在流式套接字和数据报套接字时,套接字表示的含义不一样,前者表示客户端套接字,而后者表示的是自己的套接字。

4.

如果套接字为阻塞的,在系统缓冲中没有数据的情况下,都将阻塞;如果套接字为非阻塞的,在系统缓冲中没有数据的情况下,都将立即返回,返回值在linux

下为-1,

errno被设置为EWOULDBLOCK,在windows下面返回SOCKET_ERROR, 通过WSAGetLastError返回

WSAEWOULDBLOCK.

5.如果用在流式套接字,则2者的操作是:将已在内核缓冲区的数据拷贝到应用程序自己的缓冲区,拷贝的最大的长度为调用函数时传入的缓冲区的长度,注意这里的长度不一定等于实际缓冲区的长度,可以小于缓冲区的长度,但是绝对不能大于,为什么不能大于,也许你比我更清楚。例如下面这段代码:

char szRecvBuf[1024] = { 0 };

recv( sockServer, szRecvBuf, 256, 0 );

这

里虽然定义的缓冲区的长度为1024但是接受的时候只用其中的256.

如果内核缓冲区当时有10个字节,那么这次调用立刻返回,szRecvBuf被填充了10字节,返回值是10。 如果内核缓冲区有1500个字节,那么

szRecvBuf将被填充256个字节,返回值就是256.

如

果是数据报套接字,在内核缓冲区中的数据小于要求长度(这里是256)的情况下,和流式套接字结果一样。但是大于的情况就不一样了,首先将填充256到

szRecvBuf中,并且产生一个WASEMSGSIZE的错误,并且剩下的部分被丢弃。假如内核缓冲区的数据为1000字节,那么前面的256被填充

到szRecvBuf中,后面的1000-256将被丢弃。

recvfrom的执行效果也是同样的。

上面的结论是结合msdn和实际的测试得出的。

recvfrom的实际效果也是这样。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163415.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • t276芯片(芯片st是什么意思)

    ST7789V2是一个单芯片TFT-LCD驱动器。该芯片可以直接连接到外部MCU,支持并行8080系列的8位/9位/16位/18位接口,也支持SPI串行通讯接口。显示数据可以存储在240x320x18bits的片上显示数据RAM中。它可以在没有外部操作时钟的情况下执行显示数据RAM读写操作,以尽量减少功耗。并行接口占用外部MCU芯片引脚较多,但其通讯速率较快,一般只在需要高速刷新及MCU资源比较丰富的场合使用。SPI串行通讯接口占用MCU芯片引脚较少,通讯速率相对并行接口较慢,但因其占用MCU引脚.

    2022年4月9日
  • bigdecimal保留两位小数,不够两位补0_如何保留两位小数

    bigdecimal保留两位小数,不够两位补0_如何保留两位小数BigDecimal保留两位小数核心方法详解:/**BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式*setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3*setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4*setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4*

    2022年9月16日
  • 两位数乘法速算(无意中发现)

    两位数乘法速算(无意中发现)比如目前计算12*34=?现在拿ab*cd=?举例子步骤:就是b*d的个位数放在?的个位上。。。。。。。。。。。。。。。。。①然后如果bd有十位那么先记下来(心里默记)。。。。。。。。。。。②然后计算bc+a*d+②结果得到的个位数写在①前面。。。。。。。。③然后把上一步剩下的结果除了个位数以后的保留下来。。。。。。。。。④然后…

    2022年6月7日
  • 网络安全之IP伪造

    网络安全之IP伪造

    2022年1月19日
  • 圣杯布局三种方式

    圣杯布局三种方式圣杯布局是经典的css布局,左右两栏是定宽,中间那一栏是自适应,下面将用felx、float、position三种方法进行圣杯布局,实现效果如下:圣杯布局之flexcss代码:header{ height:80px; background-color:#cccccc; } .box{ height:200px; background-color:…

    2022年6月29日
  • UML–活动图详解

    UML–活动图详解活动图活动图是状态机的一个特殊例子,它强调计算过程中的顺序和并发步骤。活动图所有或多数状态都是活动状态或动作状态,所有或大部分的转换都由原状态中完成的活动触发。活动图的含义活动图是一种用于描述系统行为的模型视图,它可用来描述动作和动作导致对象状态改变的结果,而不用考虑引发状态改变的事件。通常,活动图记录单个操作或方法的逻辑、单个用例或商业过程的逻辑流程。在UML中,活动图的起点用来描述活动…

    2022年4月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号