任何人都可以帮助我解决posix mqueue中文件描述符错误的问题。我正在尝试读取原始套接字包并将它们放在mqueue中。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<mqueue.h>
#include<netinet/ip_icmp.h>
#include<netinet/udp.h>
#include<netinet/tcp.h>
#include<netinet/ip.h>
#include<netinet/if_ether.h>
#include<net/ethernet.h>
#define QUEUE_NAME "/test_queue"
#define MAX_SIZE 71680
#define CHECK(x) \
do { \
if (!(x)) { \
fprintf(stderr, "%s:%d: ", __func__, __LINE__); \
perror(#x); \
exit(-1); \
} \
} while (0) \
int main(int argc, char **argv)
{
mqd_t mq;
struct mq_attr attr;
char buff[MAX_SIZE + 1];
unsigned char* buffer = (unsigned char*) malloc(sizeof(65536));
int saddr_size , data_size,sock_raw;
struct sockaddr saddr;
/* initialize the queue attributes */
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MAX_SIZE;
attr.mq_curmsgs = 0;
/* create the message queue */
mq = mq_open(QUEUE_NAME, O_CREAT | O_RDONLY, 0644, &attr);
CHECK((mqd_t)-1 != mq);
sock_raw = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;
if(sock_raw < 0)
{
perror("Socket Error\n");
return 1;
}
saddr_size = sizeof saddr;
data_size = recvfrom(sock_raw , buffer ,65536 , 0 , &saddr , (socklen_t*)&saddr_size);
if(data_size <0 )
{
printf("Recvfrom error , failed to get packets\n");
return 1;
}
memcpy(buff,buffer,65536);
CHECK(0 <= mq_send(mq, buffer, MAX_SIZE, 0));
printf("Msg sent");
CHECK((mqd_t)-1 != mq_close(mq));
return 0;
}我得到的输出是
主要:64:0 <= mq_send(mq、缓冲区、MAX_SIZE、0):坏的文件描述符
发布于 2014-12-12 14:42:42
您正在尝试将(mq_send)写入您打开的只读消息队列描述符(O_RDONLY)。
将“标志”参数更改为“O_CREAT | O_RDWR”,则发送将有效。
Linux手册页没有调用它,但是其他人也有:EBADF可能意味着fd或fd类句柄完全无效,或者它对请求的操作无效。
https://stackoverflow.com/questions/27444497
复制相似问题