皮皮网
皮皮网

【防伪溯源码品牌】【Vue核心实现源码】【斗牛棋牌app源码】recv函数源码_recv函数源码解析

时间:2024-12-23 22:50:52 来源:leela 源码

1.recvfrom()的recvfrom
2.linux网络编程(七)-recv()剖析
3.Linux网络编程recv,函数函数recvfrom函数
4.send与recv函数详解
5.TCP之深入浅出send&recv

recv函数源码_recv函数源码解析

recvfrom()的recvfrom

       recvfrom  recvfrom函数(经socket接收数据):

       å‡½æ•°åŽŸåž‹:int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen);

       ç›¸å…³å‡½æ•° recv,recvmsg,send,sendto,socket

       å‡½æ•°è¯´æ˜Ž:recv()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.

       è¿”回值:成功则返回接收到的字符数,失败返回-1.

       é”™è¯¯ä»£ç 

       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

       #define SERVER_IP “.0.0.1”

       main()

       {

       int s,len;

       struct sockaddr_in addr;

       int addr_len =sizeof(struct sockaddr_in);

       char buffer[];

       /* 建立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);

       }

       }

       æ‰§è¡Œ (先执行udp server 再执行udp client)

       hello /*从键盘输入字符串*/

       receive: hello /*server端返回来的字符串*/

linux网络编程(七)-recv()剖析

       recv函数的主要职责是在socket连接中接收数据,当缓冲区空闲时,源码源码它会进入阻塞状态,解析直到接收到新的函数函数数据或者对端关闭连接。默认情况下,源码源码socket操作为阻塞模式,解析防伪溯源码品牌关于设置阻塞/非阻塞模式的函数函数详细讨论将在后续文章中展开。

       recv函数的源码源码基本参数如下:

       sockfd:表示连接的文件描述符

       buf:接收数据的用户空间缓冲区

       len:缓冲区的预设大小

       flags:决定调用行为,包括是解析否阻塞等待数据

       函数执行成功时,返回实际读取的函数函数字节数。若在数据复制过程中出现错误,源码源码recv会返回一个负数错误码。解析而在网络中断导致接收数据暂停的函数函数情况下,recv会返回0。源码源码

       深入理解recv的解析内核实现,我们可以关注tcp_recvmsg函数,其核心逻辑包括检查flags选项,处理接收缓冲区中的Vue核心实现源码数据。如果没有可读数据,该函数会进入阻塞状态,直到接收到新的数据。一旦接收到数据,函数会调用skb_copy_datagram_msg将数据复制到用户空间,通过struct msghdr结构实现这一过程。

Linux网络编程recv,recvfrom函数

       接收数据时,Linux的网络编程中使用的主要函数是recv和recvfrom。它们在参数、适用场景、返回值和数据传输方式等方面存在差异。recv用于从已连接的套接字接收数据,参数包括socket描述符、接收缓冲区、数据长度和标志位等。recvfrom用于从未连接的套接字接收数据,并返回发送方的斗牛棋牌app源码地址,参数包括socket描述符、接收缓冲区、数据长度、标志位、目标地址和地址长度等。

       根据具体需求和使用场景,选择合适的函数可以更有效地实现网络数据的接收。TCP协议下,recv()函数有三种使用情况:一次性接收所有数据、限制每次接收的数据长度以及非阻塞式接收数据。在处理TCP数据流时,需要注意粘包问题,即两次发送的数据合并为一个数据包。通过正确分离每一个TCP数据段,可以避免数据处理混乱。

       UDP协议下,recvfrom()函数在接收数据前需要将socket套接字设置为非阻塞模式,铃铛宠物app源码以避免等待数据的到来。函数参数包括socket描述符、接收缓冲区、数据长度、标志位、目标地址和地址长度等。通过以上介绍,可以更好地理解如何在Linux网络编程中使用recv和recvfrom函数实现数据接收。

send与recv函数详解

       send和recv函数详解

       send函数

       send函数用于socket通信中的数据发送,其原型为:

       ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);

       关键参数包括:

       sockfd:指定发送端套接字描述符。

       buff:存放要发送的数据缓冲区。

       nbytes:需要发送的实际数据字节数。

       flags:通常设置为0,可选参数用于高级功能。

       send函数的工作原理如下:

       检查发送数据长度和sockfd发送缓冲区容量,如nbytes大于缓冲区容量,返回SOCKET_ERROR。macd智能公式源码

       若nbytes小于等于缓冲区容量,判断是否已有数据待发送,等待协议发送或直接拷贝到缓冲区剩余空间。

       根据缓冲区空间,只拷贝nbytes到剩余空间,然后返回实际拷贝的字节数。

       网络中断或错误时返回SOCKET_ERROR,接收端可能收到SIGPIPE信号。

       recv函数

       recv用于接收socket通信中的数据,定义如下:

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

       核心参数包括:

       sockfd:接收端套接字描述符。

       buf:存放接收数据的缓冲区。

       len:指定buf的长度。

       flags:通常置为0。

       recv的工作原理包括:

       等待sockfd接收缓冲区数据发送完毕,网络错误时返回SOCKET_ERROR。

       接收缓冲区无数据或数据接收完后,检查并接收数据到buf,可能需要多次recv。

       返回实际接收的字节数,错误或网络中断时返回0或特定错误值。

       网络中断时,进程可能接收到SIGPIPE信号。

       总的来说,send和recv函数分别负责在socket通信中提交和接收数据,涉及发送缓冲区和接收缓冲区的管理,以及协议层面的数据传输控制。

TCP之深入浅出send&recv

       接触过网络开发的人,了解上层应用如何使用send函数发送数据以及recv接收数据。但是,send和recv的实现原理是什么?本文将简单介绍TCP中发送缓冲区和接收缓冲区的作用,并讲解Linux系统下TCP发送和接收数据的具体实现。

       缓冲区在数据传输中起着临时缓存的作用。发送端将数据拷贝到发送缓冲区后,立即返回应用层执行其他操作,而接收端则将网络中的数据拷贝到缓冲区等待应用层读取。

       发送缓冲区在应用层调用send()发送数据时,数据会被拷贝到socket的内核发送缓冲区。send()函数在应用层返回时,并不一定意味着数据已经发送到对端,而是数据已放入socket的内核发送缓冲区。

       Linux内核提供两种方式查看tcp缓冲区大小:通过/etc/sysctl.ronf下的net.ipv4.tcp_wmem值或命令'cat /proc/sys/net/ipv4/tcp_wmem'。以笔者服务器为例,发送缓冲区大小为、、。

       通过程序可以修改当前tcp socket的发送缓冲区大小,只影响特定的socket。

       接收缓冲区用于缓存网络上来的数据,直至应用进程读取为止。当应用进程未读取数据且接收缓冲区已满时,收端会通知发端接收窗口关闭(win=0),实现TCP的流量控制。

       接收缓冲区大小可以通过查看/etc/sysctl.ronf下的net.ipv4.tcp_rmem值或命令'cat /proc/sys/net/ipv4/tcp_rmem'获取。同样,可以通过修改程序大小修改接收缓冲区,仅影响当前特定socket。

       TCP的四层模型包括应用层、传输层、网络层和数据链路层。应用层创建socket并建立连接后,可以调用send函数发送数据。传输层处理数据,以TCP为例,其主要功能包括流量控制、拥塞控制等。

       当发送数据时,数据会从应用层、传输层、网络层、数据链路层依次传递。上图为send函数源码调用逻辑图,若对源码感兴趣,可查阅net/tcp.c获取详细实现。

       recv函数实现类似,从数据链路层接收数据帧,通过网卡驱动处理后,进入内核进行协议层处理,最终将数据放入socket的接收缓冲区。

       在实际应用中,非阻塞send时,发送端可能发送了大量数据,但实际只发送了部分,缓冲区中仍有大量数据未发送。接收端recv获取数据时,可能只收到部分数据。这种情况下,应用层需要正确处理超时、断开连接等情况。

       总结来说,TCP的send和recv函数分别在应用层和传输层实现数据的发送和接收,通过内核的缓冲区控制数据的流动。正确理解这些原理对于网络编程至关重要。

更多内容请点击【时尚】专栏