当前位置:首页 » 操作系统 » linuxsend

linuxsend

发布时间: 2022-04-30 02:34:48

A. linux下send命令是干什么用的

功能描述:
发送消息,send只可用于基于连接的套接字,send

write唯一的不同点是标志的存在,当标志为0时,send等同于write。sendto

sendmsg既可用于无连接的套接字,也可用于基于连接的套接字。除了套接字设置为非阻塞模式,调用将会阻塞直到数据被发送完。
用法:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sock, const void *buf, size_t len, int flags);
ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
ssize_t sendmsg(int sock, const struct msghdr *msg, int flags);参数:
sock:索引将要从其发送数据的套接字。
buf:指向将要发送数据的缓冲区。
len:以上缓冲区的长度。
flags:是以下零个或者多个标志的组合体,可通过or操作连在一起
msg_dontroute:不要使用网关来发送封包,只发送到直接联网的主机。这个标志主要用于诊断或者路由程序。
msg_dontwait:操作不会被阻塞。
msg_eor:终止一个记录。
msg_more:调用者有更多的数据需要发送。
msg_nosignal:当另一端终止连接时,请求在基于流的错误套接字上不要发送sigpipe信号。
msg_oob:发送out-of-band数据(需要优先处理的数据),同时现行协议必须支持此种操作。
to:指向存放接收端地址的区域,可以为null。
tolen:以上内存区的长度,可以为0。

B. WINDOWS下的send,recv与LINUX下的send,recv有什么区别

1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或发送带外数据 |
| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
| MSG_WAITALL | 等待任何数据 |
|————————————————————–|
如果flags为0,则和read,write一样的操作。
2、在unix中,所有的设备都可以看成是一个文件,所以我们可以用read来读取socket数据。

C. linux socket send函数问题

SockSrv.c错了,
服务端发送数据的字符串长度都乱写,长度是多少就填多少,不要乱填,乱填会读取字符串后面的内存里面的数据的
write(connfd,"test",4);
len = send(connfd,"test\n",5,0);

D. send的Linux C 函数

经套接字传送消息
相关函数
sendto,sendmsg,recv,recvfrom,recvmsg,socket
表头文件
#include < sys/socket.h >
定义函数
ssize_t send (int s,const void *msg,size_t len,int flags);
参数说明
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程式要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字符数;
第四个参数一般置0。
函数说明
send() 用来将数据由指定的 socket 传给对方主机。使用 send 时套接字必须已经连接。send 不包含传送失败的提示信息,如果检测到本地错误将返回-1。因此,如果send 成功返回,并不必然表示连接另一端的进程接收数据。所保证的仅是当send 成功返回时,数据已经无错误地发送到网络上。
对于支持为报文设限的协议,如果单个报文超过协议所支持的最大尺寸,send 失败并将 errno 设为 EMSGSIZE ;对于字节流协议,send 会阻塞直到整个数据被传输。
flags 参数有如下的选择:
MSG_DONTROUTE 勿将数据路由出本地网络
MSG_DONTWAIT 允许非阻塞操作(等价于使用O_NONBLOCK)
MSG_EOR 如果协议支持,此为记录结束
MSG_OOB 如果协议支持,发送带外数据
MSG_NOSIGNAL 禁止向系统发送异常信息
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
错误代码
EBADF 参数 s 非法的 socket 处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
WNOTSOCK 参数 s 为一文件描述词,非 socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数 s 的 socket 为不可阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。

E. linux 下writev和send的区别

Linux的recv、send函数和read、write函数都可以用于套接字编程。不同的是recv、send只用于套接字通信;而read、write是底层系统调用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符属于是文件描述符的一种,

F. linux中read,write和recv,send的区别

Linux的recv、send函数和read、write函数都可以用于套接字编程。
区别:
1、recv、send只用于套接字通信;
2、read、write是底层系统调用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符属于是文件描述符的一种,套接字本身在Linux上就叫做套接字文件。
所以read、write函数不光可以用于套接字编程,也可以用于读取其他各种文件,比如用于文件编程读写普通文件。

G. linux中网络都断开了,但是send函数还是一直在发数据

1 确认链路是否连通状态,最好加心跳机制, 如果一定时间没有收到心跳包,或者没有回复心跳
就应认为此链路已经坏掉了,需要关闭,重新连接!

2 至于发送数据,应该检查对应的api的返回值,是否已经成功发送或者接受定长数据!
没有完成应该重新发送或者接受

3 网络数据问题,可以用抓包工具直接抓包看数据,可以看的比较透彻
工具 Linux下用tcpmp,windows用wirekshark

H. linux 网络编程 send 做了什么操作

send解析
sockfd:指定发送端套接字描述符。
buff: 存放要发送数据的缓冲区
nbytes: 实际要改善的数据的字节数
flags: 一般设置为0
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR;
2) 如果nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先检查协议是否正在发送sockfd的发送缓冲区中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送sockfd的发送缓冲区中的数据或者sockfd的发送缓冲区中没有数据,那么send就比较sockfd的发送缓冲区的剩余空间和nbytes
3) 如果 nbytes > 套接字sockfd的发送缓冲区剩余空间的长度,send就一起等待协议把套接字sockfd的发送缓冲区中的数据发送完
4) 如果 nbytes < 套接字sockfd的发送缓冲区剩余空间大小,send就仅仅把buf中的数据到剩余空间里(注意并不是send把套接字sockfd的发送缓冲区中的数据传到连接的另一端的,而是协议传送的,send仅仅是把buf中的数据到套接字sockfd的发送缓冲区的剩余空间里)。
5) 如果send函数成功,就返回实际的字节数,如果send在数据时出现错误,那么send就返回SOCKET_ERROR; 如果在等待协议传送数据时网络断开,send函数也返回SOCKET_ERROR。
6) send函数把buff中的数据成功到sockfd的改善缓冲区的剩余空间后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个socket函数就会返回SOCKET_ERROR。(每一个除send的socket函数在执行的最开始总要先等待套接字的发送缓冲区中的数据被协议传递完毕才能继续,如果在等待时出现网络错误那么该socket函数就返回SOCKET_ERROR)
7) 在unix系统下,如果send在等待协议传送数据时网络断开,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的处理是进程终止。

I. linux send 是可重入函数吗

可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。

可重入函数使用的变量有两种情况:

1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;

2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。

?

1

2

3

4

5

void strcpy(*dest,*src)



while(* dest++ = *src ++){;}

*dest = NUL;



分析:上面的函数用于字符串复制,而参数是存放在堆栈中的,故而改函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。

基本上下面的函数都是不可重入的:

1.函数内使用了静态的数据。

2.函数内使用了malloc()或者free()函数的。

3.函数内调用了标准的I/O函数的。

?

1

2

3

4

5

6

7

int temp;

void swap(int *ex1,int *ex2)



temp = *ex1;//(1)

*ex1 = *ex2;

*ex2 = temp;



分析:该函数中的全局变量temp是的函数变成了一个不可重入的函数,因为在多任务系统中,假如在任务1中调用swap函数,而程序执行到(1)处时被中断,进而执行其它的任务2,而刚好任务2也调用了swap函数,则temp里存的值则会被任务2改变。从而回到任务1被中断处继续执行的时候,temp里存的值已经不再是原来存的temp值了,进而产生了错误。

常用的可重入函数的方法有:

1.不要使用全局变量,防止别的代码覆盖这些变量的值。

2.调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。

3.使用信号量(互斥条件)。

总之:要保证中断是安全的

J. linux在send之前是否要做字节序转换,就是send是否有帮我们完成字节序转换的工作

send不做转化的,send是按照char*的形式发送的,如果你需要发送整形的数据的话,如果不能确保客户端的字节序和服务端的相同,建议在发送前hton,接收后ntoh

热点内容
怎么读取服务器地址文件java 发布:2024-10-05 05:12:21 浏览:76
获取文件名java 发布:2024-10-05 05:12:12 浏览:938
为什么qq找回密码没有密保 发布:2024-10-05 05:11:28 浏览:919
查询存在的数据库 发布:2024-10-05 05:03:04 浏览:631
安卓版微信如何找回聊天记录 发布:2024-10-05 05:03:03 浏览:449
手机吃鸡国际服要什么配置 发布:2024-10-05 04:59:11 浏览:203
沙盒工厂怎么看服务器ip 发布:2024-10-05 04:53:13 浏览:84
psvftp工具下载 发布:2024-10-05 04:08:14 浏览:353
怎么设qq空间密码 发布:2024-10-05 04:00:51 浏览:440
积分兑换系统源码 发布:2024-10-05 03:57:45 浏览:691