Linux下怎么在send的时候,Bad file descriptor

Linux下怎么在send的时候,Bad file descriptor,第1张

因为是从windows 移植到 Linux ,而且用到libevent库,很多东西都要改

其中有这么一条:

evutil_socketpair(AF_INET,SOCK_STREAM,0,fd)

在Linux下如果运行 send(fd[0],"",1,0)总是返回-1,perror(),返回Bad file descriptor

网上查了一下:可能是因为文件描述符错误,或者关闭等原因

于是去查libevent的utils.h头文件

在Linux下evutil_sockepair()实际调用的是Linux系统函数socketpair()

又去Linux man socketpair

人家说了,在Linux下socketpair传入的只能是AF_UNIX,OK,找到了问题

把原来的evutil_socketpair(AF_INET,SOCK_STREAM,0,fd)改为evutil_socketpair(AF_UNIX,SOCK_STREAM,0,fd)正常运行

所以排错思路,和查找资料是很重要的能力啊!!!

经套接字传送消息

相关函数

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 传给系统调用的参数不正确。

在linux的网络编程,特别是TCP的编程中,SIGPIPE信号错误是一个比较常见的问题,我猜测你是在使用TCP的socket吧,如果是这样的话,很有可能是你在向一个已经处于关闭状态的socket写数据,因为TCP是面向连接的协议。如果对方将socket给close掉了,而你还继续往这个 socket写数据,就会触发这个信号。 因此,建议你在write之前检查一下对方是否已经close掉了这个socket。 如果回答得不对,可以继续追问哈


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7444478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存