И ещё раз здравствуйте, значится победив прошлую проблему с помощью 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;
}
Сокет - создается, слушается. Но - ничего не принимает, второе приложение - с ним соединяется - и все. Не ответа, ни привета. В чем может быть затык?