- 论坛徽章:
- 1
|
- #include "tcp.h"
- //int n=0; // 移动到tcp.h
- struct epoll_event ev;// epoll事件结构体
- struct epoll_event events[MAX_EVENTS_TCP];// 事件监听队列
- int server_sock_fd_tcp;// 服务器端套接字
- int client_sock_fd_tcp;// 客户端套接字
- int nfds_tcp;// epoll监听事件发生的个数
- int len_recv_data_tcp;
- struct sockaddr_in host_addr_tcp; // 服务器网络地址结构体
- struct sockaddr_in remote_addr_tcp; // 客户端网络地址结构体
- int sin_size;
- unsigned char send_data_buffer_size_tcp[BUFFER_SIZE_TCP]; // 数据传送的缓冲区
- int m=0;
- //设置句柄为非阻塞方式
- int setnonblocking(int sockfd)
- {
- if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
- {
- return -1;
- }
- return 0;
- }
- int tcp_send_data_to_pc(int len,char* buffer)
- {
- printf("in while n == %d \n",n);
- send(events[n].data.fd,buffer,8,0);
- ev.events = EPOLLIN;
- ev.data.fd = events[n].data.fd;
- epoll_ctl(epoll_fd_tcp, EPOLL_CTL_MOD, ev.data.fd, &ev);
-
- }
- void tcp_initialize()
- {
- struct rlimit rt;
-
- /* 设置每个进程允许打开的最大文件数 */
- rt.rlim_max = rt.rlim_cur = 1024;
- if (setrlimit(RLIMIT_NOFILE, &rt) == -1)
- {
- perror("setrlimit");
- exit(1);
- }
- else
- {
- printf("setrlimit ok! \n");
- }
-
- // 创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
- if((server_sock_fd_tcp=socket(PF_INET,SOCK_STREAM,0))<0)
- {
- perror("socket");
- //return 1;
- }
- else
- {
- printf("Tcp server socket ok...\n");
- }
-
- // 设置 socket属性,端口可以重用
-
- int opt=SO_REUSEADDR;
- setsockopt(server_sock_fd_tcp,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
- setnonblocking(server_sock_fd_tcp);
-
- memset(&host_addr_tcp,0,sizeof(host_addr_tcp)); // 数据初始化--清零
- host_addr_tcp.sin_family=PF_INET; // 设置为IP通信
- host_addr_tcp.sin_addr.s_addr=inet_addr(HOST_IP_ADDRESS_TCP);// 服务器IP地址--允许连接到所有本地地址上
- host_addr_tcp.sin_port=htons(HOST_PORT_TCP); // 服务器端口号
-
- // 将套接字绑定到服务器的网络地址上
- if (bind(server_sock_fd_tcp,(struct sockaddr *)&host_addr_tcp,sizeof(struct sockaddr))<0)
- {
- perror("bind");
- //return 1;
- }
- else
- {
- printf("Tcp server bind ok...\n");
- printf("IP : %s \n", inet_ntoa(host_addr_tcp.sin_addr));
- printf("port: %d \n",ntohs(host_addr_tcp.sin_port));
- }
- // 监听连接请求--监听队列长度为5
- listen(server_sock_fd_tcp,64);
- sin_size=sizeof(struct sockaddr_in);
-
- }
-
- // 创建一个epoll句柄
- int create_epoll_tcp(unsigned int event_num)
- {
- int epoll_fd;
- epoll_fd=epoll_create(event_num);
- if(epoll_fd==-1)
- {
- perror("epoll_create failed");
- }
- ev.events=EPOLLIN | EPOLLET;
- ev.data.fd=server_sock_fd_tcp;
- // 向epoll注册server_sockfd监听事件
- if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,server_sock_fd_tcp,&ev)==-1)
- {
- perror("epll_ctl:server_sock_fd_tcp register failed");
- }
- else
- {
- printf("socket adding in epoll success! \n");
- }
- return epoll_fd;
- }
- void do_process_tcp_nowhile()
- {
- // 等待事件发生
- nfds_tcp=epoll_wait(epoll_fd_tcp,events,1024,-1);
- if(nfds_tcp==-1)
- {
- perror("start epoll_wait failed");
- //exit(EXIT_FAILURE);
- }
- else
- {
- printf(" epoll nfds_tcp = %d \n",nfds_tcp);
- }
-
- for(n=0;n<nfds_tcp;++n)
- {
- printf(" for loop epoll nfds_tcp = %d \n",nfds_tcp);
- // 客户端有新的连接请求
- if(events[n].data.fd == server_sock_fd_tcp)
- {
- // 等待客户端连接请求到达
- if((client_sock_fd_tcp=accept(server_sock_fd_tcp,(struct sockaddr *)&remote_addr_tcp,&sin_size))<0)
- {
- perror("accept client_sock_fd_tcp failed");
- exit(EXIT_FAILURE);
- }
- // 向epoll注册client_sockfd监听事件
- setnonblocking(client_sock_fd_tcp);
- ev.events=EPOLLIN | EPOLLET;
- ev.data.fd=client_sock_fd_tcp;
- if(epoll_ctl(epoll_fd_tcp,EPOLL_CTL_ADD,client_sock_fd_tcp,&ev)==-1)
- {
- perror("epoll_ctl:client_sock_fd_tcp register failed");
- //exit(EXIT_FAILURE);
- }
- printf("accept client %s\n",inet_ntoa(remote_addr_tcp.sin_addr));
-
- }
- else if(events[n].events & EPOLLIN)
- {
- // 客户端有数据发送过来
- sprintf(send_data_buffer_size_tcp,"");
- //sin_size=sizeof(remote_addr_tcp);
-
- len_recv_data_tcp=recv(events[n].data.fd,send_data_buffer_size_tcp,BUFFER_SIZE_TCP,0);
- if(len_recv_data_tcp<=0)
- {
- printf("close id is : %d \n",events[n].data.fd);
- if(epoll_ctl(epoll_fd_tcp,EPOLL_CTL_DEL,events[n].data.fd,&ev)==0)
- {
- printf("delete ok \n");
- close(events[n].data.fd);
- }
- else
- {
- printf("delete error \n");
- }
- }
- else
- {
- printf("current recv fd is : %d \n",events[n].data.fd);
- printf("recv data: %d\n ",len_recv_data_tcp);
- for(m=0;m<4;m++)
- printf(" %02X",send_data_buffer_size_tcp[m]);
- printf("\n");
- printf("\n");
- ev.data.fd = events[n].data.fd;
- ev.events = EPOLLOUT|EPOLLET;
- epoll_ctl(epoll_fd_tcp, EPOLL_CTL_MOD, events[n].data.fd, &ev);
- }
- }
- else if(events[n].events & EPOLLOUT)//发送
- {
- tcp_send_data_to_pc(4,send_data_buffer_size_tcp);
- tcp_send_data_to_pc(4,send_data_buffer_size_tcp);
- printf(" n == %d \n",n);
- }
- }
-
- if(server_sock_fd_tcp>0)
- {
- printf("socket close \n");
- shutdown(server_sock_fd_tcp,SHUT_RDWR);
- close(server_sock_fd_tcp);
- }
- }
复制代码 |
|