其中有这么一条:
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。 如果回答得不对,可以继续追问哈欢迎分享,转载请注明来源:内存溢出
评论列表(0条)