/** * FileName : main.c * Author : Niejun * CreateDate : 2008-03-06 * Right : 2003-2008 */
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <pthread.h>
#include <sys/select.h> #include <sys/time.h>
#define SERV_PORT 5818 #define MAX_CONNECTION 20 #define MAX_BUF_SIZE 1024
/******************************** Function define *****************************/ static void cmd_server_thread(void *pPara); static int CreateTcpServer(); static int AcceptConnect(int sockfd); /**************************** End of function define **************************/
static pthread_t cmd_serv_thread_id = 0;
int main(int argc, char **argv) {
printf("\nInterface system initialization, please wait a moment...\n");
printf("Init cmd server thread...\n");
if (pthread_create(&cmd_serv_thread_id, NULL, (void *)&cmd_server_thread, NULL)) { printf("Create cmd_server_thread error!\n"); } while (1) { printf("This is main thread\n"); sleep(3); } return 0; }
static void cmd_server_thread(void *pPara) {
int count = 0; int serv_fd, conn_fd; int recv_len, mesg_len; char recv_buf[MAX_BUF_SIZE]; char mesg[MAX_BUF_SIZE+1]; fd_set rset,gRset; int se; int pos; char *p_buf;
struct timeval timeout;
timeout.tv_sec = 5; timeout.tv_usec = 0;
serv_fd = CreateTcpServer();
if (serv_fd == -1) { fprintf(stderr, "Create tcp server error!\n"); exit(-1); }
FD_ZERO(&gRset); FD_SET(serv_fd, &gRset);
while (1) {
memcpy(&rset, &gRset, sizeof(fd_set)); se = select(serv_fd+1, &rset, NULL, NULL, &timeout); timeout.tv_sec = 5; timeout.tv_usec = 0;
//printf("continue\n");
if (se <= 0) continue;
if (FD_ISSET(serv_fd, &rset)) { conn_fd = AcceptConnect(serv_fd);
FD_SET(conn_fd, &gRset);
printf("This is accept\n");
} if (conn_fd) {
if (FD_ISSET(conn_fd, &gRset)) {
while (1) { memset(recv_buf, 0, sizeof(recv_buf)); recv_len = recv(conn_fd, recv_buf, MAX_BUF_SIZE, 0);
if (recv_len < 1) { break; }
printf("Recv len [%d]\n", recv_len);
printf("Recv str [%s]\n", recv_buf); printf("Select return [%d]\n", se);
recv_buf[recv_len] = '\0'; if (!strcmp(recv_buf, "Connect\n")) { printf("This connection is passed\n"); mesg_len = sprintf(mesg, "%s\n", "OK 99998"); goto send_mesg; } else { mesg_len = sprintf(mesg, "%s\n", "{99998} {OK} {INFO}"); goto send_mesg; }
send_mesg: send(conn_fd, mesg, mesg_len, 0);
}
FD_CLR(conn_fd, &gRset); } close(conn_fd); }
}
clse(serv_fd); pthread_exit(0); } /* End of cmd_server_thread() */
static int CreateTcpServer() { int SockFd=-1; int sockopt = 1; int ssize = sizeof(struct sockaddr_in); struct sockaddr_in saddr;
saddr.sin_family = AF_INET; saddr.sin_port = htons(SERV_PORT); //htons(SERV_PORT);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
SockFd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(SockFd, SOL_SOCKET, SO_RCVTIMEO, (char *)&sockopt, sizeof(sockopt)); setsockopt(SockFd, SOL_SOCKET, SO_SNDTIMEO, (char *)&sockopt, sizeof(sockopt)); setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof(sockopt));
if (bind(SockFd, (struct sockaddr *)&saddr, ssize) == -1) { fprintf(stderr, "bind error!\n"); close(SockFd); return -1; } if (listen(SockFd, MAX_CONNECTION) == -1) { fprintf(stderr, "listen error!\n"); close(SockFd); return -1; }
return SockFd; } /* End of CreateTcpServer() */
static int AcceptConnect(int sockfd) { struct sockaddr_in clientAddr; int ssize = sizeof(struct sockaddr_in); int newsock; newsock = accept(sockfd, (struct sockaddr *)&clientAddr, &ssize);
if (newsock == -1) { fprintf(stderr, "AcceptConnect error!\n"); close(sockfd); return -1; }
return newsock; }
|