精华内容
下载资源
问答
  • 网络编程 recv()函数

    千次阅读 2016-12-29 21:26:39
    recv()是编程语言函数。...这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时: (1)recv先等待套接字s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络
    recv()是编程语言函数。

    函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);

    这里只描述同步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。
    注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
    实例:

    读数据的时候需要考虑的是 当recv()返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完 ,也意味着该次事件还没有处理完,所以还需要再次读取:
    while(rs)
    {
    buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);
    if(buflen < 0)
    {
    // 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读
    // 在这里就当作是该次事件已处理
    if(errno == EAGAIN)
    break;
    else
    return;
    }
    else if(buflen == 0)
    {
    // 这里表示对端的 socket已正常关闭.
    }
    if(buflen != sizeof(buf))
    rs = 0;
    else
    rs = 1;// 需要再次读取
    }

    展开全文
  • 本文主要介绍了python网络编程调用recv函数完整接收数据的三种方法。具有很好的参考价值,下面跟着小编一起来看下吧
  • socket编程recv函数返回值说明

    千次阅读 2018-11-08 14:26:34
    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲...

    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,原因为超时,待测)

    展开全文
  • C语言网络编程recv函数详解

    千次阅读 2019-10-14 23:14:24
    ssize_t recv(int sockfd, void *buf, size_t len, int flags); 函数功能:接收对方发送当数据 可以同样使用recvfrom函数来接收数据 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,s...
    函数描述
    • 头文件 #include <sys/socket.h>
    • ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    • 函数功能:接收对方发送当数据
      可以同样使用recvfrom函数来接收数据
      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
      recvfrom函数的最后两个参数写为NULL和0的时候与recv的功能完全一样
    • 返回值:成功返回发送的字节数;失败返回-1,同时errno被设置
    • 函数参数:
      a. sockfd 通信文件描述符
      b. buf 应用缓存,用于存放要发送到数据
      可以是任何类型:结构体,int , char,float,字符串
      c. len buf的大小
      d. flags 一般设置为0,此时send为阻塞式发送
      即发送不成功会一直阻塞,直到被某个信号终端终止,或者直到发送成功为止。
      指定MSG_NOSIGNAL,表示当连接被关闭时不会产生SIGPIPE信号
      指定MSG_DONTWAIT 表示非阻塞发送
      指定MSG_OOB 表示带外数据
    代码实例

    socket.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <pthread.h>
    
    typedef struct data {
    	char name[30];
    	unsigned int num;
    }Data;
    
    void print_err(char *str, int line, int err_no) {
    	printf("%d, %s :%s\n",line,str,strerror(err_no));
    	_exit(-1);
    }
    int cfd = -1;
    
    //线程函数用于循环从cfd描述符中尝试接收数据
    void *receive(void *pth_arg) {
    	int ret = 0;
    	Data stu_data = {0};
    	while(1) {
    		//初始化结构体变量
    		bzero(&stu_data, sizeof(stu_data));
    		ret = recv(cfd, &stu_data, sizeof(stu_data),0);	
    		if (-1 == ret) {
    			print_err("recv failed",__LINE__,errno);
    		}
    		//接收之后需要将网络端序转换为主机端序
    		printf("student number = %d student name = %s \n",ntohl(stu_data.num),stu_data.name);
    	}
    }
    
    int main()
    {
    	int skfd = -1, ret = -1;
    	skfd = socket(AF_INET, SOCK_STREAM, 0);
    	if ( -1 == skfd) {
    		print_err("socket failed",__LINE__,errno);
    	}
    
    	struct sockaddr_in addr;
    	addr.sin_family = AF_INET; //设置tcp协议族
    	addr.sin_port = 6789; //设置端口号
    	addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //设置ip地址
    
    	ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));
    	if ( -1 == ret) {
    		print_err("bind failed",__LINE__,errno);
    	}
    	
     	/*将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接*/
    	ret = listen(skfd, 3);
    	if ( -1 == ret ) {
    		print_err("listen failed", __LINE__, errno);
    	}
    
    	/*被动监听客户端发起的tcp连接请求,三次握手后连接建立成功*/
    	struct sockaddr_in caddr = {0};
    	int csize = 0;
    	cfd = accept(skfd, (struct sockaddr*)&caddr, &csize);
    	if (-1 == cfd) {
    		print_err("accept failed", __LINE__, errno);
    	}
    	printf("cport = %d, caddr = %s\n", ntohs(caddr.sin_port),inet_ntoa(caddr.sin_addr));
    	
    	//创建子线程用于接收数据
    	pthread_t id;
    	pthread_create(&id,NULL,receive,NULL);
    	
    	//发送数据结构体定义
    	Data std_data = {0};
    	while (1) {
    		printf("stu name:\n");
    		scanf("%s",std_data.name);
    		
    		
    		printf("stu num:\n");
    		scanf("%d",&std_data.num);
    		//对于int型的需要将主机端序转换为网络端序,这里转成long型。
    		std_data.num = htonl(std_data.num);
    		
    		//将数据std_data强制类型转换后发送
    		ret = send(cfd, (void *)&std_data,sizeof(std_data),0);
    		if ( -1 == ret) {
    			print_err("accept failed", __LINE__, errno);
    		}	
    	}
    	
    	return 0;
    }
    

    编译gcc socket.c -lpthread

    展开全文
  • Linux网络编程--recv函数返回值详解

    万次阅读 2016-04-13 14:37:50
    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个参数指明一个...
    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,原因为超时,待测)
    展开全文
  • recv函数 1)头文件 #include <sys/types.h> #include <sys/socket.h> 2)函数声明形式 ssize_t recv(int sockfd, void *buf, size_t len, int flags); 函数功能 1)接收数据 2)成功:返回接收数据字节...
  • socket 网络编程recv()函数错误

    千次阅读 2008-03-14 15:14:00
    LINux下网络编程,采用非阻塞模式,调用recv函数,系统出错代码:Resource temporarily unavailable。由此查资料: 1、阻塞模式和非阻塞模式的区别 阻塞模式没有消息,服务器是多线程的,客户机为了不影响性能,也...
  • int send( SOCKET s, const char FAR *buf,...客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。  该函数的第一个参数指定发送端套接字描述符;  第二个参数指明一个存放应
  • 在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题。这里,简要介绍一下判别数据接收接收完成常用的三种方法: 1.基础数据接收法:  使用基础数据...
  • UNIX网络编程——send与recv函数详解

    千次阅读 2014-07-10 21:02:53
    UNIX网络编程——send与recv函数详解 分类: UNP(API) 2013-07-28 22:43 320人阅读 评论(0) 收藏 举报 [cpp] view plaincopyprint? #include ssize_t recv(int sockfd, void *buff...
  • 我在调用recv函数来取客户端发过来的数据时,如果收到的数据长度大于我设置的缓冲大小也就是BUFSIZ 比如发过来的是10个字符 , 那么do while 循环会循环两次,如果我发送过来的正好是9个字符 , 为啥只循环了一次呢...
  • 1、recv()函数 recv()函数用于socket通信中接收消息 #include <sys/types.h> #include<sys/socket.h> ssize_t recv(int sockfd, void *buff,size_t nbytes,int flags); sockfd:文件描述符; buff...
  • 继续之前的在VC++上的win32网络编程版本,这次试试在VS上运行: 开发环境:VS2015 和 VS2013 这次在跑之前的代码的时候,发现有几个bug: 1. 客户端并没有send,服务端会继续调用recv函数(而不是被阻塞),接收到...
  •  其实,socket在传输数据时,传递的是字节,我们在接受recv或发送send时,可以用字符串char*接受,但不能用strLen表示接受数据的长度,因为当接受的数据长度与实际长度不匹配时,socket套接字将关闭,recv返回结果...
  • Windows网络编程recv()函数

    千次阅读 2020-03-16 17:01:27
    一、作用与原理 得到指定客户端(参数1)发来的消息 ...外面调用recv的作用,就是通过socket找到这个缓冲区,并把数据复制进参数2,复制参数3个 二、句法 int recv( SOCKET s, char *buf, int len, int f...
  • 今天在做socket网络通信实验时,server端执行到recv函数处报错:Transport endpoint is not connected。 以下是server和client的源码: server.c 1 #include <stdio.h> 2 #include <arpa/inet.h>...
  • listen()函数 是换换内容得时候了。假如你不希望与远程的一个地址相连,或者说, 仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们。处 理过程分两步:首先,你听--listen(),然后,你接受--accept()...
  • socket编程---send函数&recv函数详解

    千次阅读 2018-04-07 21:04:19
    socket函数创建了一个socket fd,看一下socket fd的概念:套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段...
  • 我写了个客户端接受服务器的数据,用recv接收,当缓冲区的大小小于发送的数据的大小后 要怎么处理recv函数,本人刚开始学习socket编程,还望大神们赐教啊!!!!!
  •   Send函数和Recv函数解析 分类: Linux网络编程2010-09-20 14:20 3625人阅读 评论(3) 收藏 举报 socketsockets网络服务器unixtcp Send函数和Recv函数解析 1. send函数 int se
  • 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的...
  • read/recv函数返回值

    2021-04-11 02:13:30
    在linux网络编程中: read/recv函数返回值 > 0 实际读到的字节数 = 0 已经读到结尾(对端已经关闭) -1 需要进一步判断errno的值 errno = EAGAIN or EWOULDBLOCK 设置了非阻塞方式读,并且没有数据到达 errno = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,074
精华内容 18,829
关键字:

网络编程recv函数