Example #1
0
int main(int argc, char* argv[])
{	
	int port = 23;
	thread_func func = thread_receive;
	if (argc > 1) {
		port = atoi(argv[1]);
	}
	if (argc > 2 && strcmp(argv[2], "send") == 0) {
		func = thread_send;			
	}

	signal(SIGINT, signal_func);

	int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	struct sockaddr_in addr, remote;
	socklen_t          addrlen = sizeof(addr);
	memset(&addr, 0, addrlen);
	addr.sin_family = AF_INET;
	addr.sin_port   = htons(port);
	addr.sin_addr.s_addr = INADDR_ANY;

	setreuse(sock);
	if(bind(sock, (struct sockaddr *)&addr, addrlen) < 0) {
		fprintf(stderr, "bind %s\n", strerror(errno));
		return 1;
	}

	setrcvbuflen(sock, RCVBUF_LENGTH);
	setsndbuflen(sock, SNDBUF_LENGTH);
	if(listen(sock, 5) < 0) {
		fprintf(stderr, "listen %s\n", strerror(errno));
		return 1;
	}
	
	int clisock = -1;
	while (1) {
		memset(&remote, 0, addrlen);
		if ((clisock = accept(sock, (struct sockaddr *)&remote, &addrlen)) < 0) {
			fprintf(stderr, "accept %s\n", strerror(errno));
			return 1;
		}

		printf("accept client address %s:%d socket:%d MSS:%d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port), clisock, getMSS(clisock));
		pthread_t		th;
		pthread_attr_t	thattr;
		pthread_attr_init(&thattr);
		pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_DETACHED);
		pthread_create(&th, &thattr, func, &clisock);

	}

	close(sock);

	return 0;
}
Example #2
0
static void connect_redis(connector_t pconredis)
{
    int ret = 0;
    int sockfd = INVALID_ID;
    struct sockaddr_in redis_addr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        print_log(LOG_TYPE_ERROR, "socket, file = %s, line = %d", __FILE__, __LINE__);
        return;
    }

    setnonblock(sockfd);
    setreuse(sockfd);
    set_tcp_fastclose(sockfd);

    bzero(&redis_addr, sizeof(redis_addr));
    redis_addr.sin_family = AF_INET;
    redis_addr.sin_port = htons(pconredis->port);

    if (inet_pton(AF_INET, pconredis->ip, &redis_addr.sin_addr) < 0)
    {
        close(sockfd);
        print_log(LOG_TYPE_ERROR, "inet_pton, file = %s, line = %d", __FILE__, __LINE__);
        return;
    }

    ret = connect(sockfd, (struct sockaddr *)&redis_addr, sizeof(redis_addr));

    if (ret == 0)
    {
        pconredis->sockfd = sockfd;
        connector_sig_read(pconredis);
        pconredis->state = CONN_STATE_RUN;
    }
    else if (errno == EINPROGRESS)
    {
        pconredis->sockfd = sockfd;
        connector_sig_write(pconredis);
        pconredis->state = CONN_STATE_CONNECTING;
    }
    else
    {
        close(sockfd);
        print_log(LOG_TYPE_ERROR, "connect error, file = %s, line = %d", __FILE__, __LINE__);
    }
}
Example #3
0
peer_t *tcpbus_server(const char *in_addr,
		   const char *port,
		   void (*on_connect)(peer_t*),
		   void (*on_disconnect)(peer_t*),
		   void (*on_input)(peer_t*),
		   void *ext_ptr)
{
	int ret;
	struct sockaddr_in addr;
	peer_t *peer;

	jlog(L_NOTICE, "server ready: %s:%s", in_addr, port);

	peer = calloc(sizeof(peer_t), 1);
	peer->type = TCPBUS_SERVER;
	peer->on_connect = on_connect;
	peer->on_disconnect = on_disconnect;
	peer->on_input = on_input;
	peer->recv = tcpbus_recv;
	peer->send = tcpbus_send;
	peer->disconnect = tcpbus_disconnect;
	peer->buffer = NULL;
	peer->ext_ptr = ext_ptr;

	peer->socket = socket(PF_INET, SOCK_STREAM, 0);
	if (peer->socket < 0) {
		jlog(L_NOTICE, "socket failed: %s", strerror(errno));
		free(peer);
		return NULL;
	}

	memset(&addr, 0, sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(port));
	addr.sin_addr.s_addr = inet_addr(in_addr);

	ret = setreuse(peer->socket);
	if (ret < 0) {
		jlog(L_NOTICE, "setreuse: %s", strerror(errno));
		close(peer->socket);
		free(peer);
		return NULL;
	}

	ret = bind(peer->socket, (const struct sockaddr *)&addr, sizeof(const struct sockaddr));
	if (ret < 0) {
		jlog(L_NOTICE, "bind failed: %s %s", strerror(errno), in_addr);
		close(peer->socket);
		free(peer);
		return NULL;
	}

	/* The backlog parameter defines the maximum length the
	 * queue of pending connection may grow to. LISTEN(2)
	 */
	ret = listen(peer->socket, CONN_BACKLOG);
	if (ret < 0) {
		jlog(L_NOTICE, "set_nonblocking failed: %s", strerror(errno));
		close(peer->socket);
		free(peer);
		return NULL;
	}

	ret = tcpbus_ion_add(peer->socket, peer);
	if (ret < 0) {
		jlog(L_NOTICE, "tcpbus_ion_add failed: %s", strerror(errno));
		close(peer->socket);
		free(peer);
		return NULL;
	}

	return peer;
}
Example #4
0
/**
 * main()
 */
int main()
{
   int lsd = -1;             //listening socketdescriptor
   int asd = -1;             //new socketdescriptor from accept
   int port  = TM_PORT_ECHO; //default port
   int error = 0;
   int result;
   //int i;

   struct sockaddr_in addr;
   struct sockaddr_in claddr;
   char ClientIP[17];
   int  taskrdy = -1;
   
   initServer();
   startDK40Task();
   initSubServerTask(lsd,error);
   RTX_Sleep_Time(100);
   lsd = openListenSocket(lsd,error);

   
   #ifdef TCPSERV_DEBUG
   printf("\r\nTCP Echoserver: Öffnen einen Socket %d",lsd);
   #endif

  /**
   * Setzt den horchenden Socket auf Wiederverwendbar ein
   * @param lsd Den Socketdeskriptor des horchenden Sockets
   * @param error Fehlercode
   * @return (0) für erfolgreich, ungleich (0) für fehler
   */
   result = setreuse(lsd,&error);
   	
   	#ifdef TCPSERV_DEBUG
   	if(result == API_ERROR){
     	printf("\r\nTCP Echoserver: Set reuse failed %d",error);
   	}
   	#endif
   	
	addr.sin_family =  PF_INET;
	addr.sin_port   =  htons(port); //Konvertierung von Little Endian zu Big Endian
	addr.sin_addr.s_addr =  0L;

   	result = bind(lsd,(struct sockaddr *)&addr,&error);
   	if(result == API_ERROR){
   		printf("\r\nTCP Echoserver, Bind socket failed %d",error);
   		shutDownServer(lsd,error);
	}//(result == API_ERROR)
   

   /*
    * Endlosschleife, horcht und baut Verbindungen auf
    */
   while(1)
   {
      /**
       * listen
       */
      result = listen(lsd, MAX_SERVER, &error);
      if(result == API_ERROR){
        printf("\r\nTCP Echoserver, listen failed %d",error);
        shutDownServer(lsd,error);
      	}//if(result == API_ERROR)

      /**
       * accept , establish a connection
       */
      claddr.sin_family      =  PF_INET;
      claddr.sin_port        =  0;    //clear
      claddr.sin_addr.s_addr =  0L;   //clear

      result = accept(lsd,(struct sockaddr *)&claddr,&error);
      if(result == API_ERROR){
		printf("\r\nTCP Echoserver, accept failed %d",error);
        shutDownServer(lsd,error);
      	}//if(result == API_ERROR)
      
      InetToAscii(&claddr.sin_addr.s_addr,ClientIP);
      
      	#ifdef TCPSERV_DEBUG
      	printf("\r\nTCP Echoserver: Connected with %s , Port %u\r\n",ClientIP,claddr.sin_port);
      	#endif
      
      
      asd = result;
      cnt_connection++;

	       #ifdef SERVER_SHUTDOWN_TEST
    		if(cnt_connection>6L){

	          result =  closesocket(asd,&error);
    	      if(result==API_ERROR){
             	printf("\r\nTCP Echoserver, socket close failed %d",error);
          		}
          	printf("\r\nTCP Echoserver: Shutdown test\r\n");
          	shutDownServer(lsd,error);
      		}//if(cnt_connection>6L)
		   #endif

      /**
       * Suche einer ruhenden Server Task 
       */
      taskrdy =  Get_Free_Server_Task();
      if(taskrdy == -1){  //no sleeping task found
         
         #ifdef TCPSERV_DEBUG
         	printf("\r\nTCPserver: busy, refusing connection with %s , Port %u\r\n",ClientIP,claddr.sin_port);
         #endif
         closesocket(asd, &error);
      }//if(taskrdy == -1)
      else{
      		//insert the socket descriptor
        	EchoServer[taskrdy].sd = asd;
         
	        //and wakeup the sleeping server task
    	    result = RTX_Wakeup(EchoServer[taskrdy].taskID);
         
        	if(result != 0){
           		printf("\r\nTCPserver: wakeup error\r\n");
	           closesocket(asd, &error);
			}//if(result != 0)
        	else{
	        //a task is waked up and serves from now on this connection
    	    }
      }//elseif(taskrdy == -1)  //no sleeping task found
   }//while(1)    //do forever
}