⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 tcp/ip服务端测试源码
💻 CPP
字号:
#include <stdio.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <errno.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <termios.h>
#include <string.h>

//
char g_center_host[16] = "127.0.0.1";
char g_center_port[8]  = "8001";
int  g_link[FD_SETSIZE] = { 0 };

//
int tcp_server_init(int port);
//
int tcp_connect2(const char *host, const char *serv);
//
int g_create_thread(pthread_t &tid, pthread_attr_t *attr, void*(*thread_proc)(void *),  void * param );
//
int g_select(int n, fd_set  *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

////////////////////////////////////////////////////////
int connect_to_center(int trynum,int wait_second);
int connect_accept( int server_fd, fd_set *rset, int &connect_fd );
int connect_process( fd_set *rset );
int process_accept ( int server_fd );


int main(int argc, int *argv[])
{
	fd_set rset;
	int server_fd;
	int connect_fd;
	int nready;
    int i;

 	printf( "start...\n" );
	server_fd = tcp_server_init( 8001 );

     process_accept( server_fd );

    /*

	printf( "init success.\n" );
	FD_ZERO(&rset);
	FD_SET(server_fd, &rset);

	for(;;)
    //while ( FD_ISSET( server_fd, &rset ) )
	{//1
		printf( "select ...\n" );
		nready = g_select(FD_SETSIZE, &rset, NULL, NULL, NULL);

		if (nready==0) continue;
		if (nready<0)
		{//2
			//log("!!!select error!");
			printf("!!!select error!\n");
			continue;
		}//2
		printf( "select success.\n" );


        connect_fd = accept( server_fd, (struct sockaddr *)NULL, NULL);
        if (connect_fd <= 0)
    	{
	    	printf("accept error !");
            continue;
    	}
    	printf("A new up client join in!\n");

	    for(i=0;i<FD_SETSIZE;i++)
			{
				if(g_link[i] <= 0)
				{//3
					g_link[i] = connect_fd;
                    printf( "i = %d\n", i );
					break;
				}//3
			}
	    if(i == FD_SETSIZE)
			{//3
				printf("!!!Too many clients!\n ");
				printf("System will refuse the other client's connect request!\n");
				close(connect_fd);
				continue;
			}//3
	    FD_SET(connect_fd, &rset);
        printf( "connect_fd = %d\n", connect_fd );

		//nready--;
		//maxbi++;
		puts( "connect_accept success." );	
		//deal up			
		connect_process( &rset );
	
	}//1
    //*/
}


int tcp_connect2(const char *host, const char *serv)
{
     struct sockaddr_in addr;
     struct hostent *hostaddr;
     int s;
     int reuse;
     int port;
     
     port=atoi(serv);
     s = socket(PF_INET, SOCK_STREAM, 0);
     if (s == -1) return -1;
     
     hostaddr=gethostbyname(host);
     if(!hostaddr)
     {
     	return -1;
     }	
     
     bzero(&addr,sizeof(addr));
  	
     addr.sin_family = AF_INET;
     addr.sin_port = htons(port);
     addr.sin_addr.s_addr = htonl(INADDR_ANY);
     memcpy(&addr.sin_addr.s_addr,hostaddr->h_addr,hostaddr->h_length);
     		
     if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) == -1)
     {
	    close(s);
	    return -1;
     }
     return (s);
}

int connect_to_center(int trynum,int wait_second)
{
	int fd,i=0;
	for(;;)
	{
		printf( "count: %d\n", i );
		fd = tcp_connect2(g_center_host, g_center_port);
		if(fd > 0) return fd;
		printf( "connect failed!\n" );
		if(trynum == -1 || i++ < trynum)
		{
			sleep(wait_second);
			continue;
		}
		else break;
	}
	return fd;
}




int  g_select(int n, fd_set  *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
{
    int ret;
try_again:
    ret = select(n, readfds, writefds, exceptfds, timeout);
    if (ret < 0) {
        switch (errno) {
        case EINTR:
            goto try_again;
        case EAGAIN:
            goto try_again;
        case EBADF:
        default:
            break;
        }
    }
    return ret;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////
// create thread

int g_create_thread(pthread_t &tid, pthread_attr_t *attr, void*(*thread_proc)(void *),  void * param )
{
	pthread_attr_t attr1;
	if (attr==NULL)
		attr = &attr1;
	int prilocy;
	pthread_attr_init(attr);	
	pthread_attr_setschedpolicy(attr,1);
	
	if(pthread_create(&tid,attr,thread_proc,param)!=0)
	{
		return -1;
	}
	
	if(pthread_detach(tid)!=0)
	{
		return -1;
	}
	return 0;
}


int tcp_server_init(int port)
{
    int on = 1;
    short serv_port = port;
	struct sockaddr_in serv_addr;

    int m_serv_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (m_serv_sockfd == -1) {
        printf("serv_socket error\n");
        exit(0);
    }

    bzero(&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family        = AF_INET;
    serv_addr.sin_addr.s_addr   = htonl(INADDR_ANY);
    serv_addr.sin_port          = htons(serv_port);
    if (bind(m_serv_sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) 
	{
        printf("bind serv_sockfd error\n");
        exit(1);
    }

//    if (fcntl(serv_sockfd, F_SETFL, fcntl(serv_sockfd[i],
//       F_GETFL, 0) | O_NONBLOCK) < 0)
//        printf("fcntl error\n");

    if (listen(m_serv_sockfd, 20) == -1) {
        printf("listen error\n");
        exit(1);
    }
    return m_serv_sockfd;
}

int connect_accept( int server_fd, fd_set *rset, int &connect_fd )
{
	int i;
	
	//if(FD_ISSET( serv_sockfd, &rset))
	//{
	connect_fd = accept( server_fd, (struct sockaddr *)NULL, NULL);

	if (connect_fd < 0) 
	{
		printf("accept error !");
	}
	if(connect_fd <= 0) return -1;

	printf("A new up client join in!\n");
			
	for(i=0;i<FD_SETSIZE;i++)
			{
				if(g_link[i] <= 0)
				{//3
					g_link[i] = connect_fd;
					break;
				}//3
			}
			
	if(i == FD_SETSIZE)
			{//3
				printf("!!!Too many clients!\n ");
				printf("System will refuse the other client's connect request!\n");	
				close(connect_fd);
				return -1; 
			}//3

	FD_SET(connect_fd, rset);
	return 0;	
}


int connect_process( fd_set *rset )
{
	int i = 0;
    int j = 0;
    char buf[1024];
    int len=0;
    
	//while (j++<100)
    {
	    for(i=0;i<FD_SETSIZE;i++)
    	{//2
            len = 0;
            //printf( "i=%d\n", i );
	    	if (FD_ISSET(g_link[i], rset)) 
		    {//3
                printf( "i=%d\n", i );
                //send( g_link[i], "xx", 2, 0 );
                puts( "read" );
    			bzero(buf,1024);
 		    	len = recv( g_link[i], buf, 100, 0);
          
                if ( len > 0 )
                {
                     buf[len] = 0;
                     printf( "receive len: %d.", len);
                     printf( "%s\n", buf );
                     
                }
                else
                {
                    strcpy( buf, "nothing to receive." );
                    len = strlen( buf );
                    close( g_link[i] );
                    FD_CLR( g_link[i], rset);
                    g_link[i] = 0;
              
                }
                send( g_link[i], buf, len, 0); 
            }
        }
        // if ( len > 0 ) break;
        // usleep( 1000 );
     }
     printf( "connect end\n" );
     return 1;
				/*		
					if(len <= 0)
					{//4
						close(i);
						printf("!!! One UP client disconnect!\n");
						FD_CLR(i,&rset);
						for(j=0;j<FD_SETSIZE;j++)
						{ 
							if(g_link[j]<=0)
								continue;
							if(g_link[j]==i)
							{
								g_link[j] = -1;
								break;
							}		
						}
						//maxbi--;
					}//4
				//*/	
             

						//log(buf,len);
						//get_hex_data(buf,len);
						//for(i=0;i<FD_SETSIZE;i++)
						//{
							//if(m_link.client[i]<0) continue;
							//write(g_link[i],buf,len);
						//}
						//list_produce(incoming, p);
				
		//}//3
	//}//2	
}

int   process_accept( int server_fd )
{
    int connect_fd;
    int i=0;
    char str[256] = "";
    int len;
    
    //while( 1 )
    {
        connect_fd = accept( server_fd, (struct sockaddr *)NULL, NULL);
        if ( connect_fd == -1 )
        {
            perror( "accept error!" );
            exit(1);
        }
        printf( "send data\n" );
        while ( 1 )
        {
            len = recv( connect_fd, str, 256, 0 );
            if (len>0 )
            {
                printf( "Recive: %s\n", str );
                send( connect_fd, str, strlen( str ), 0 );
            }
            if ( strcmp( str, "quit" )==0 )
               break;    
        }
    }
    return 1;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -