LINUX.ORG.RU

И вновь потоки[C]


0

2

И ещё раз здравствуйте, значится победив прошлую проблему с помощью XLockDisplay, XUnlockDisplay. Таймер бодренько отрабатывает, окошко бодренько прорисовывается. Но где-то я косякнул, и - работают только потоки.

int make_socket (uint16_t port){
	int sock;
	struct sockaddr_in name;
	sock = socket (AF_INET, SOCK_STREAM, 0);
	if (sock < 0){
		perror ("socket");
		exit (EXIT_FAILURE);
	}
	name.sin_family = AF_INET;
	name.sin_port = htons (port);
	name.sin_addr.s_addr = htonl (INADDR_ANY);
	if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
		{
			perror ("bind");
			exit (EXIT_FAILURE);
		}
	return sock;
}

int parseCommand(char *cmd){
  Display *dsp;
  Window wnd;
  char *param, *value;
  param = strtok(cmd, "/");
  value = strtok(NULL, "/");
 if (strcmp(param, "cmd")==0)
  {
      if (strcmp(value, "start")==0)// cmd/start/
      {
          printf("%s\n", value);
         unlockDisplay(&dsp,&wnd);
	// Добавляем время
	//       timer_add_time("0.01");
      }
      else if (strcmp(value, "exit")==0) // cmd/exit/
           {
            //printf("%s\n", value);
            if(blockDisplay(&dsp,&wnd) < 0){
				fprintf(stderr,"Cannot open Display\n");
				exit(-1);
			}
           }
      else if (strcmp(value, "block")==0) // cmd/block/
           {
            printf("%s\n", value);
            if(blockDisplay(&dsp,&wnd) < 0){
				fprintf(stderr,"Cannot open Display\n");
				exit(-1);
			}
           }
 }
  else if (strcmp(param, "settime")==0) // settime/60/ (settime/количество минут)
        {
           //printf("%s\n", value);
           unlockDisplay(&dsp,&wnd);
        //   window_init();
	// Добавляем время
	      timer_add_time(value);
	
        }
return 0;
	//return(0);
}

int read_from_client (int filedes){
	char buffer[MAXMSG];
	int nbytes;
	nbytes = read (filedes, buffer, MAXMSG);
	if (nbytes < 0){
		perror ("read");
		exit (EXIT_FAILURE);
	}
	else if (nbytes == 0)
		return -1;
	else{
		buffer[nbytes-1] = '\0';
		parseCommand(buffer);
		return 0;
	}
}

int main()
{	
extern int make_socket (uint16_t port);
	int sock;
	fd_set active_fd_set, read_fd_set;
	int i;
	struct sockaddr_in clientname;
	size_t size;
	uint16_t PORT;
	pthread_t tthread,wthread;
	pthread_t sthread;
	 sigset_t sigmask;
	int tterror,wterror,arg,arg1;
	int sign;
	if ( sign = pthread_create(&sthread,NULL,checkSignal,NULL)!= 0){
		printf("TThread creation failed: %d\n", sign);
	}
	if( wterror = pthread_create(&wthread,NULL,initWindow,(void*)arg1)) {
                        printf("TThread creation failed: %d\n", wterror);
					}
	pthread_sigmask(SIG_BLOCK,&sigmask,0); 
	if( tterror = pthread_create(&tthread,NULL,initTimer,(void*)arg)) {
                        printf("TThread creation failed: %d\n", tterror);
					}
//	pthread_sigmask(SIG_BLOCK,&sigmask,0); 	
	
					
	//pthread_join (thread, NULL); 
	struct ccafe_params parms;
    printf ("Initializing parameters to default values...\n");
    init_parameters (&parms);
    printf ("Reading config file...\n");
    parse_config (&parms);
    printf ("Final values:\n");
    printf ("port: %s, MSG: %s\n", parms.port,parms.MMSG);
    MAXMSG = atoi(parms.MMSG);
    PORT = atoi(parms.port);
    sock = make_socket(PORT);
   // printf ("sock: %s",(char*)sock);
	if (listen (sock, 1) < 0){
		perror ("listen");
		exit (EXIT_FAILURE);
	}
	FD_ZERO (&active_fd_set);
	FD_SET (sock, &active_fd_set);
	while (1){
		read_fd_set = active_fd_set;
		if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0){
			perror ("select");
			exit (EXIT_FAILURE);
		}
		for (i = 0; i < FD_SETSIZE; ++i)
			if (FD_ISSET (i, &read_fd_set)){
				if (i == sock){
					int new;
					size = sizeof (clientname);
					new = accept (sock,(struct sockaddr *) &clientname,&size);
					if (new < 0){
						perror ("accept");
						exit (EXIT_FAILURE);
					}
				//	fprintf (stderr,"Server: connect from host %s, port %hd.\n",inet_ntoa (clientname.sin_addr),ntohs (clientname.sin_port));
					FD_SET (new, &active_fd_set);
				}
				else{

					if (read_from_client (i) < 0){
						close (i);
						FD_CLR (i, &active_fd_set);
					}
				}
			}
	}
	for(;;)  {}
	//pthread_join (sthread, NULL); 
  return 0;
}
Сокет - создается, слушается. Но - ничего не принимает, второе приложение - с ним соединяется - и все. Не ответа, ни привета. В чем может быть затык?

Не вижу смысла использовать select() при блокируюшем i/o, сильно не вникал но похоже «Не ответа, ни привета» это просто блокировка на read(). Читай Стивенса, там все написано.

capricorn20 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.