#include "vxworks.h" 
#include "sockLib.h" 
#include "inetLib.h" 
#include "MyServer.h" 
 
#define DEFAULT_SERVER_PORT 6699 
int server; 
SEM_ID Server_SM; 
/* 
* Start the function Server() as a task in AppInit() like this: 
* int ret = 0; 
* ret = taskSpawn("tServer", 165, 0x0002, 1024,(FUNCPTR) Server,  
* 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);  
*/ 
void Server() 
{ 
    int rc = 0,sd = 0; 
    int addr_len = 0;  
    int server_sock = 0; 
    struct sockaddr_in server_addr,client_addr; 
     
    memset(&server_addr,0,sizeof(struct sockaddr_in)); 
    memset(&client_addr,0,sizeof(struct sockaddr_in)); 
    server_sock = socket(AF_INET,SOCK_STREAM,0); 
    if(server_sock < 0) 
    { 
     printf("Failed to create Socket.\n");  
        return; 
    } 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port = htons(DEFAULT_SERVER_PORT); 
    rc = bind(server_sock,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)); 
    if(rc == -1) 
    { 
     close(server_sock); 
     printf("Failed to bind socket\n"); 
     return; 
    } 
    rc = listen(server_sock,2); 
    if(rc == -1) 
    { 
     printf("socket listen error\n"); 
     return; 
    }  
    printf("TCP server is ready for receive connection request\n"); 
    while(1) 
    { 
        addr_len = sizeof(struct sockaddr_in); 
     sd = accept(server_sock,(struct sockaddr *)&client_addr,&addr_len); 
     if(sd <= 0) 
     { 
         printf("socket accept error\n"); 
         return; 
     } 
     else 
     { 
         printf("Socket connect success\n"); 
         server = sd; 
         server_proc(sd); 
     } 
    } 
} 
      
void server_proc(int sock) 
{ 
    int rc = 0; 
    char buffer[32]; 
    fd_set socket; 
    struct timeval wait; 
     
    wait.tv_sec = 0; 
    wait.tv_usec = 500000; 
     
    while(server > 0) 
    { 
     FD_ZERO(&socket); 
     FD_SET(sock,&socket); 
      
     rc = select(FD_SETSIZE,&socket,(fd_set *)0,(fd_set *)0,&wait); 
     if(rc == 0) 
         continue; 
     if(FD_ISSET(sock,&socket)) 
     { 
         semTake(Server_SM, WAIT_FOREVER); 
         memset(buffer,0,sizeof(buffer)); 
         rc = recv(sock,buffer,sizeof(buffer),0); 
         if(rc > 0) 
         { 
            /* you can add your application specific code here */ 
             printf("RecvMsg:%s\n",buffer); 
             semGive(Server_SM); 
         } 
         else 
         { 
            printf("Socket closed\n"); 
            close(sock); 
            server = 0; 
            semGive(Server_SM); 
            break; 
         } 
     }  
     taskDelay(10); 
    } 
      
}  
 
/* end of the file */