快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C语言的recv函数 c语言recv函数用法

C语言winsocket编程recv函数接收数据问题

不对,除非你接收前把缓冲区置0 用RtlZeroMemory函数。

黄冈网站建设公司创新互联建站,黄冈网站设计制作,有大型网站制作公司丰富经验。已为黄冈上千多家提供企业网站建设服务。企业网站搭建\成都外贸网站建设要多少钱,请找那个售后服务好的黄冈做网站的公司定做!

你可以在接收那里加判断啊,满足你的条件时继续执行,执行完成再重置缓冲区

c语言如何检测网络是否连接

1、如果对方断开连接的话,那么readNum = recv ( socketId, rcvBuf, rcvBufSize, 0 );

readNum返回值应该是0,可以根据返回值判断。

2、recv函数返回值说明

recv函数

int recv( SOCKET s, char FAR *buf, int len, int flags);

不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0。

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,

(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,

(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数 据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的), recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。 默认 socket 是阻塞的 解阻塞与非阻塞recv返回值没有区分,都是 0 出错 =0 连接关闭 0 接收到数据大小,

特别:返回值0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。

返回说明: 成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1,errno被设为以下的某个值 EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效的描述词 ECONNREFUSE:远程主机阻绝网络连接 EFAULT:内存空间访问出错 EINTR:操作被信号中断 EINVAL:参数无效 ENOMEM:内存不足 ENOTCONN:与面向连接关联的套接字尚未被连接上 ENOTSOCK:sock索引的不是套接字 当返回值是0时,为正常关闭连接;

思考:当对侧没有send,即本侧的套接字s的接收缓冲区无数据,返回值是什么(EAGAIN,原因为超时,待测)

unix C语言关于socket的recv和send的问题,代码中也有问题

你的代码其实没有任何问题,之所以 server 没有打印,是由于server最后打印时的代码是

printf("%s",buff);

把它改成

printf("%s\n",buff);

即可。 标准输出是行缓冲的,所以如果打印的内容没有 \n 了话,内容不会真正打印出来,而是留在缓冲中。

至于你client打印时

printf("recv from server :%s", buff);

虽然没有在后面加 \n, 但是你从server发到client的消息里已经带有 \n 了,所以这里没出问题。

关于标准输入输出缓冲相关的更多细节,自己搜一下吧。

htons和inet_aton有什么区别?

htons 是把 主机使用的字节序转成网络字节序 (即入参是整数,返回值也是整数)

而 inet_aton 是吧 ascii 字符串形式的IP地址 转换成 网络字节序的整数。

自己去搜一下网络字节序相关信息。

c语言的recv()非阻塞方法怎么弄哦

需要将recv设置超时,Linux下设置超时如下:

//设置发送超时

struct timeval timeout={3,0};//3s

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)timeout,sizeof(struct timeval));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)timeout,sizeof(struct timeval));

windows下设置超时如下:

int timeout = 3000; //3s

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,timeout,sizeof(timeout));

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,timeout,sizeof(timeout));

Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。

你好

recv函数只是在用户空间定义的。内核空间有与之对应的函数,也就是说,执行recv函数就会调用到内核中与它对应的函数,实际起作用的就是内核里的这个函数。

至于内核里调用的是那个函数,你不需要是找,那样会把你看晕的,内核里的调用关系复杂的很,除非对内核非常了解的,才会找到到底是怎么调用的,他也是只是找到怎么调用的,至于为什么这样调用是极少人知道的。得问linux的开发者。因为内核的代码量是太多了。有人花了三年时间才看完内核代码。

souce insight只能查找内核里有的东西,属于内核的。recv()函数是不属于内核的,所以用这个是查找不到的

希望可以帮到你,望选为满意答案

recv()函数怎么一次接收send()三次发送的数据(c语言实现)。

不可能知道服务器是否已经发送完毕,因为你发送的没有数据协议的格式,你可以让发送方与接收方定个协议。其实你可以在recv时加个参数,让它只是看看有没有数据到达,recv最后那个参数设为MSG_OOB就可以,当发现有数据到时,你先Sleep一下,至于多长时间就要看实际情况,一般几十个毫秒就绝对够了,然后,你再recv一下,这次最后那个参数为MSG_WAITALL就可以,这样就一次性接收完毕


本文标题:C语言的recv函数 c语言recv函数用法
网站链接:http://6mz.cn/article/hgjsso.html

其他资讯