- 论坛徽章:
- 0
|
源码如下,请各位大虾帮忙查查问题
#include <sys/epoll.h>
#include "wtcppack.h"
#include "pubfunctions.h"
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define MY_SOCKET int
MY_SOCKET listenfd;
MY_SOCKET g_listenfd;
int epfd = 0;
void *thread_main(void *data);
void setnonblocking(int sock)
{
int opts;
opts = fcntl(sock,F_GETFL);
if (opts < 0) {
perror("fcntl(F_GETFL)");
exit(0);
}
opts = (opts | O_NONBLOCK);
if (fcntl(sock,F_SETFL,opts) < 0) {
perror("fcntl(F_SETFL)");
exit(1);
}
return;
}
int mylisten(void)
{
epfd = epoll_create(512);
if (epfd == -1)
{
printf("epoll_create error, errono = %d\n", errno);
return epfd;
}
g_listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (g_listenfd == -1)
{
printf("create listen socket error, errono = %d\n", errno);
return g_listenfd;
}
else
printf("create listen socket ok, socket = %d\n", g_listenfd);
setnonblocking(g_listenfd);
struct epoll_event ev;
ev.data.fd = g_listenfd;
ev.events=EPOLLIN | EPOLLET;//EPOLLPRI | EPOLLERR | EPOLLHUP;
if (epoll_ctl(epfd,EPOLL_CTL_ADD, g_listenfd, &ev))
{
printf("cpoll_ctl listen socket error, errono = %d\n", errno);
return -1;
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
char *local_addr = "192.168.1.18";
inet_aton(local_addr,&(serveraddr.sin_addr));
serveraddr.sin_port=htons(10002);
if (bind(g_listenfd, (sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{
printf("bind listen socket error, errono = %d\n", errno);
return -1;
}
if (listen(g_listenfd, 1024) == -1)
{
printf("listen socket error, errono = %d\n", errno);
return -1;
}
return 0;
}
void thread_make()
{
pthread_t tid;
pthread_attr_t threadAttr1;
pthread_attr_init(&threadAttr1);
pthread_attr_setstacksize(&threadAttr1, 1024 * 1024);
if(pthread_create(&tid,&threadAttr1,&thread_main,NULL)!=0)
{
printf("Create tcp thread error\n");
return;
}
}
void *thread_main(void *data)
{
struct epoll_event events[100];
for ( ; ; ) {
printf("begin epoll wait, threadid = %d\n", pthread_self());
int nfds=epoll_wait(epfd,events,100, -1);
printf("time=%u, count= %d\n", time(NULL), nfds);
for(int i=0;i<nfds;++i)
{
printf("%u begin epoll wait, fd = %d, events = %lu\n", i, events[i].data.fd, events[i].events);
if(events[i].data.fd == g_listenfd )
{
struct sockaddr_in clientaddr;
socklen_t clilen = sizeof(clientaddr);
memset(&clientaddr, 0, sizeof(clientaddr));
int connfd = accept(g_listenfd,(sockaddr *)&clientaddr, &clilen);
if(connfd<0){
printf("error in g_listenfd %s\n",strerror(errno));
continue;
}
setnonblocking(connfd);
printf("new connection fd = %d\n", connfd);
struct epoll_event ev;
ev.data.fd=connfd;
ev.events=EPOLLIN | EPOLLET | EPOLLHUP;
//ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
epoll_ctl(epfd, EPOLL_CTL_ADD, connfd ,&ev);
//sleep(5);
}
else if(events[i].events&EPOLLIN)
{
char buffer[102400] = {0};
if ( (events[i].data.fd) < 0) continue;
int connfd = events[i].data.fd;
while(1)
{
int a = recv(connfd, buffer, 55, 0);
//if(a>=0)
printf("a = %d\n",a);
if (a == 0)
{
struct epoll_event ev;
ev.data.fd=connfd;
if (epoll_ctl(epfd, EPOLL_CTL_DEL, connfd ,&ev) == 0)
{
//ev.events=EPOLLHUP|EPOLLERR|EPOLLOUT|EPOLLET|EPOLLPRI;
//printf("epoll_ctl after del return = %d\n", epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev));
}
if (myclose(connfd) == 0)
printf("close success\n");
else
printf("close error\n");
break;
}
else //if(a>0)
{
usleep(1000 * 10);
struct epoll_event ev;
ev.data.fd=connfd;
ev.events=EPOLLIN | EPOLLET|EPOLLHUP;
//ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
int s = epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev);
printf("s = %d, %s\n",s, strerror(errno));
break;
}
/*else
continue;*/
}
printf("while break;\n");
}
else if(events[i].events&EPOLLOUT)
{
if ( (events[i].data.fd) < 0) continue;
int connfd = events[i].data.fd;
//send(connfd, buffer, strlen(buffer), 0);
struct epoll_event ev;
ev.data.fd=connfd;
ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev);
}
else if(events[i].events&EPOLLERR)
{
printf("error on fd = %d\n", events[i].data.fd);
}
else if(events[i].events&EPOLLHUP)
{
printf("hup on fd = %d\n", events[i].data.fd);
}
else if (events[i].events & EPOLLPRI)
{
printf(" epollpri %d\n", events[i].data.fd);
}
else if (events[i].events & EPOLLET)
printf("epollet %d\n", events[i].data.fd);
}
}
}
int main()
{
mylisten();
thread_make();
while (1)
{
}
} |
|