ZeroMQ通讯出现Too many open files (epoll.cpp:39)

qq_24049561 2016-09-19 03:43:33
发送端代码:
void ZMQ_sendpcap(Packet * p)
{
void * pCtx = NULL;
void * pSock = NULL;
int num=0;
//使用tcp协议进行通信,需要连接的目标机器IP地址为192.168.1.2
//通信使用的网络端口 为7766
const char * pAddr = "tcp://127.0.0.1:7766";

//创建context
if((pCtx = zmq_ctx_new()) == NULL)
{
return ;
}
//创建socket
if((pSock = zmq_socket(pCtx, ZMQ_PUSH)) == NULL)
{
zmq_ctx_destroy(pCtx);
return ;
}
int iSndTimeout = 10000;// millsecond
//设置接收超时
if(zmq_setsockopt(pSock, ZMQ_BACKLOG, &iSndTimeout, sizeof(iSndTimeout)) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
//连接目标IP192.168.1.2,端口7766
if(zmq_connect(pSock, pAddr) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
if(p->dsize !=0)
{
char mymsg[1024*100]={0};
int len=strlen(p->data);
// printf("eth_dst:%s\n eht_src:%s\n Src_ip:%d\n dst_ip:%d\n Src_port:%u\n Dst_port:%u\n Trans_type:%c\n",
// p->eh->ether_dst,p->eh->ether_src,p->iph->ip_src,p->iph->ip_dst,p->sp,p->dp,p->iph->ip_proto);


// snprintf(mymsg, sizeof(mymsg), "he!*%d* eth_dst:%s\n eht_src:%s\n Src_ip:%d\n dst_ip:%d\n "
// "Src_port:%u\n Dst_port:%u\n Trans_type:%c\n %s",
// len,p->eh->ether_dst,p->eh->ether_src,p->iph->ip_src,p->iph->ip_dst,
// p->sp,p->dp,p->iph->ip_proto,p->data);
snprintf(mymsg, sizeof(mymsg), " eth_dst:%s\n eht_src:%s\n Src_ip:%d\n dst_ip:%d\n Src_port:%u\n Dst_port:%u\n Trans_type:%c\n magic%d*%s",
p->eh->ether_dst,p->eh->ether_src,p->iph->ip_src,p->iph->ip_dst,p->sp,p->dp,p->iph->ip_proto,len,p->data);
// snprintf(mymsg, sizeof(mymsg), "magic%d*%s",len,p->data);
if(zmq_send(pSock, mymsg, sizeof(mymsg), 0) < 0)
{
fprintf(stderr, "send message faild\n");
// continue;
}
zmqsendno++;
printf("send message[%d] : [%s] succeed\n",zmqsendno, mymsg);
}
zmq_close(pSock);
}
接收端代码:
//包含zmq的头文件
#include <zmq.h>
#include "stdio.h"
#include<string.h>
#include<stdio.h>

int main(int argc, char * argv[])
{
void * pCtx = NULL;
void * pSock = NULL;
int num=0;
int mc;
const char * pAddr = "tcp://127.0.0.1:7766";

//创建context,zmq的socket 需要在context上进行创建
if((pCtx = zmq_ctx_new()) == NULL)
{
return 0;
}
//创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式
//具体使用方式请参考zmq官方文档(zmq手册)
if((pSock = zmq_socket(pCtx, ZMQ_PULL)) == NULL)
{
zmq_ctx_destroy(pCtx);
return 0;
}
int iRcvTimeout = 5000;// millsecond
//设置zmq的接收超时时间为5秒
if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
//绑定地址 tcp://*:7766
//也就是使用tcp协议进行通信,使用网络端口 7766
if((mc=zmq_bind(pSock, pAddr)) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
printf("bind at : %s\n", pAddr);
while(1)
{
char szMsg[1024*10] = {0};
char *str=NULL;
char *str1=NULL;
str=szMsg;
char l[1024]="";
int arr=0;
zmq_pollitem_t items[1];
items[0].socket = pSock;
items[0].fd = 0;
items[0].events = ZMQ_POLLIN;

int nRet = zmq_poll(items,1,-1);
if(0 == nRet)
continue;


// printf("waitting...\n");
errno = 0;
//循环等待接收到来的消息,当超过5秒没有接到消息时,
//zmq_recv函数返回错误信息 ,并使用zmq_strerror函数进行错误定位
if(zmq_recv(pSock, szMsg, sizeof(szMsg), 0) < 0)
{
printf("error = %s\n", zmq_strerror(errno));
continue;
}

str1=strstr(str,"magic");
if(str1!=NULL)
{
str1=str1+5;
while(*str1!='*')
{
l[arr++]=*str1++;
}
str1++;
int len=strlen(str1);
int ll=atoi(l);
if(len==ll)
{
num++;
printf("received message[%d] : %s\n",num, str1);
}
}

}

zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
发送端不断地发送pcap包里面的报文载荷信息,接收端接受信息,然后过了一会会出现Too many open files (epoll.cpp:39)错误,发送端程序死掉。
错误截图如下:

ZMQ通信也是这几天才刚学,然后碰到这个错误基本上很少人知道,百度都百度不到。希望大家帮帮忙,谢了!
...全文
1576 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧