前言:本文是socket-send发送源码分析文章的子篇,主要分析 tcp_sendmsg_locked 这个函数的源码逻辑。 对应实际调用代码:tcp_sendmsg # tcp_sendmsg_locked net\ipv4\tcp_ipv4.c # 3310 行 struct proto tcp_prot…
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR; 2) 如果nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先检查协议是否正在发送sockfd的发送缓冲区中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s...
send发送数据实际上是将数据(应用层buf中的数据)拷贝到套接字sockfd的缓冲区(内核中的sockfd对应的发送缓冲区)中,内核中的发送缓存中的数据由协议(TCP,UDP没有发送缓冲区)传输。send函数将buf中的数据成功拷贝到发送缓冲区后就返回了,如果协议后续发送数据到接收端出现网络错误的话,那么下一个socket函数就会返回SOCKE...
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR; 2) 如果nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先检查协议是否正在发送sockfd的发送缓冲区中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s...
从源码可以看到,我们在用户态使用的 send 函数和 sendto 函数其实都是 sendto 系统调用实现的。send 只是为了方便,封装出来的一个更易于调用的方式而已。 在sendto 系统调用里,首先根据用户传进来的 socket 句柄号来查找真正的 socket 内核对象。接着把用户请求的 buff、len、flag 等参数都统统打包到一个 struct...
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR。 2) 如果nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先检查协议是否正在发送sockfd的发送缓冲区中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送...
剩下的事情就交给下一层,协议栈里的函数 inet_sendmsg 了,其中 inet_sendmsg 函数的地址是通过 socket 内核对象里的 ops 成员找到的。大致流程如图。 有了上面的了解,我们再看起源码就要容易许多了。源码如下: //file: net/socket.c SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len...
6) send函数把buff中的数据成功copy到sockfd的改善缓冲区的剩余空间后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个socket函数就会返回SOCKET_ERROR。(每一个除send的socket函数在执行的最开始总要先等待套接字的发送缓冲区中的数据被协议传递...
给你一个代码,linux下编译运行即可,做了简单的注释,client.c如下:send()函数在client.c末尾 include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#define MAXLINE 4096 //发送接受信息长度#define PORT ...
send(sock_fd,line,size,0); close(sock_fd); } #include<sys/socket.h> #include<netinet/in.h> #include<unistd.h> voidSendto() { sockaddr_inreceiver_addr; intsock_fd; charline[15]="Hello World!"; sock_fd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); ...