jlaij 2015-03-05 12:34 采纳率: 0%
浏览 2841

libevent多线程服务器错误

#include "lib_net.h"
#include "lib_thread.h"
#include "lib_public.h"
#include

#include
#include

#define BACKLOG 10
#define MAX_EVENTS 500
#define THRD_NUM 5

char ip[24];
short port;

struct st_listenserv
{
int sockfd;
struct event *ev_listen;
struct event_base *base;
};

struct st_thrd_work
{
int clifd;
pthread_t pid;
int status;
struct event_base *base;
struct event *ev_read;
struct event *ev_write;
char buf[1024];
};

int last_active = 0;
struct st_thrd_work *st_thrd;

void initsocket(struct st_listenserv *listenserv);
void accept_cb(int fd, short events, void *arg);
void send_cb(int fd, short events, void *arg);
void release_read(struct st_thrd_work *thrd_work);
void release_write(struct st_thrd_work *thrd_work);
void thrd_work_cb(int fd, short events, void *arg);
void thrd_work(struct st_thrd_work *st_work);
void thrd_work_process(void *arg);

int main(int argc, char *argv[])
{
int i=0;
sigset(SIGPIPE, SIG_IGN);
if(argc < 3)
{
perror("input server port");
return -1;
}
memcpy(ip, argv[1], 24);
port = atoi(argv[2]);
struct st_listenserv listenserv;
initsocket(&listenserv);
//创建线程池
st_thrd = calloc(THRD_NUM, sizeof(struct st_thrd_work));
for(i=0; i<THRD_NUM; ++i)
{
st_thrd[i].base = event_base_new();
}
for(i=0; i<THRD_NUM; ++i)
{
thrd_work(&st_thrd[i]);
}

listenserv.base = event_base_new();
listenserv.ev_listen = event_new(listenserv.base, listenserv.sockfd,EV_READ | EV_PERSIST,accept_cb,NULL);
event_add(listenserv.ev_listen, NULL);
event_base_dispatch(listenserv.base);

}

void initsocket(struct st_listenserv *listenserv)
{
listenserv->sockfd = lib_tcpsrv_init(ip,port);
if(listenserv->sockfd < 0)
{
perror("server create socket error");
return;
}
if(lib_set_nonblock(listenserv->sockfd) < 0)
{
perror("set nonblock error");
return;
}
printf("init socket ok\n");
}

void accept_cb(int fd, short events, void *arg)
{
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
int clifd = lib_tcpsrv_accept(fd, &cin);
if(clifd <0)
{
perror("accept error");
}
if(lib_set_nonblock(clifd) < 0)
{
perror("set nonblock error");
return;
}
printf("new conneciotn [%s:%d]\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));

int tid = (++last_active) % THRD_NUM;
struct st_thrd_work *thrd = st_thrd + tid;
last_active = tid;
thrd->clifd = clifd;
printf("{%lu : %d}\n", thrd->pid, thrd->clifd);

thrd->ev_read = event_new(thrd->base, thrd->clifd, EV_READ|EV_PERSIST, thrd_work_cb, thrd);
if(thrd->ev_read != NULL)
    event_add(thrd->ev_read, NULL);

if(last_active > 1000)
    last_active = 0;

}

void thrd_work_cb(int fd, short events, void *arg)
{
struct st_thrd_work *thrd_work = (struct st_thrd_work *)arg;
//有事件时进行处理
int recvlen = 0;
if( thrd_work != NULL)
{
recvlen = lib_tcp_recv(thrd_work->clifd, thrd_work->buf,1024, -1);
if(recvlen < 0)
{
perror("recv error");

close(thrd_work->clifd);
release_read(thrd_work);
return;
}
printf("recv data:%s\n", thrd_work->buf);
memset(thrd_work->buf, 0, sizeof(thrd_work->buf));

    thrd_work->ev_write = event_new(thrd_work->base, thrd_work->clifd, EV_WRITE, send_cb, thrd_work);
    if(thrd_work->ev_write != NULL)
        event_add(thrd_work->ev_write, NULL);
}

}

void thrd_work_process(void *arg)
{
struct st_thrd_work *st_work = (struct st_thrd_work *)arg;
printf("====%lu====\n", st_work->pid);
do
{
if(st_work->clifd > 0)
{
break;
}
} while (1);

event_base_dispatch(st_work->base);
event_base_free(st_work->base);

}

void thrd_work(struct st_thrd_work *st_work)
{

if(st_work != NULL)
{
    lib_thread_create(&(st_work->pid), thrd_work_process, st_work, 1);
}

}

void send_cb(int fd, short events, void arg)
{
struct st_thrd_work *thrd_work = (struct st_thrd_work
)arg;
if(thrd_work->clifd <= 0)
return;
int sendlen = lib_tcp_send(thrd_work->clifd, thrd_work->buf, 1024);
if(sendlen < 0)
{
perror("send error");

close(thrd_work->clifd);
release_write(thrd_work);
}
memset(thrd_work->buf, 0, sizeof(thrd_work->buf));
}

void release_read(struct st_thrd_work *thrd_work)
{
if(thrd_work == NULL)
{
return;
}
if(NULL != thrd_work->ev_read)
{
event_del(thrd_work->ev_read);
event_free(thrd_work->ev_read);

}

}

void release_write(struct st_thrd_work *thrd_work)
{
if(thrd_work == NULL)
return;
if(thrd_work->ev_write != NULL)
{
event_free(thrd_work->ev_write);
}
}

完整代码:https://github.com/Addision/test_libevent_thrd_server
总是报段错误,不知道什么地方有问题,求解答

  • 写回答

2条回答

  • oyljerry 2015-03-06 02:04
    关注

    设置断点,gdb attach上去,单步跟踪一下,多数是指针等操作问题

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决