Chinaunix首页 | 论坛 | 博客
  • 博客访问: 141475
  • 博文数量: 12
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 433
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-25 14:25
文章分类

全部博文(12)

文章存档

2009年(3)

2008年(9)

我的朋友

分类: C/C++

2008-05-26 17:05:29

我写了一个简单的服务器模型,用于循环读取客户端传来的数据,用于学习基本的网络编程非常有用哦.

/**
 *    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;
}

阅读(959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~