Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema nel codice
Forum - C/C++ - Problema nel codice

Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 16:04
Lunedì, 09/08/2010
Questo topic è stato chiuso dal moderatore

Ho recentemente creato una chat client-server e ora sto sperimentando l'uso di thread multipli.
Ho un problema con del codice ma non riesco a capire dove sto sbagliando perchè i dei due thread ne funziona solo uno.
Ecco le parti che hanno problemi. Ne mancheranno altre ma stabiliscono semplicemente la connessione e controllano il login.
Ci sono anche parti di OBJ-C perchè l'interfaccia è mac.

CLIENT
Codice sorgente - presumibilmente C/C++

  1. - (void) update //funzione che aggiorna il testo
  2. {
  3.         if(is_complete)
  4.         {
  5.                 send_message("completerefresh");
  6.                 receive_message();
  7.                 [text setString:[NSString stringWithCString:newtext encoding:NSUTF8StringEncoding]];
  8.         }
  9.         else
  10.         {
  11.                 send_msg_message("çççççrefreshççççç");
  12.                 receive_msg_message();// qui c'è il problema in pratica sembra che nel punto segnalato sotto il thread non riceva niente
  13.                 if(strcmp(newtext, "no_messages") != 0)
  14.                 {
  15.                         [text setString:[[text string] stringByAppendingString:[NSString stringWithCString:newtext encoding:NSUTF8StringEncoding]]];
  16.                 }
  17.         }
  18. }


socket.c contiene tutte le funzioni che uso
Codice sorgente - presumibilmente C++

  1. /*
  2.  *  socket.c
  3.  *  SDFChat
  4.  *
  5.  *  Created by Alberto Antonini on 01/06/10.
  6.  *  Copyright 2010 __MyCompanyName__. All rights reserved.
  7.  *
  8.  */
  9. #include "def.c"
  10.  
  11. #ifndef socket_H
  12. #define socket_H
  13.  
  14. #define SOCKET_ERROR        -1
  15. #define SOCKET_GOOD                     1
  16. #define BUFFER_SIZE         100
  17. #define HOST_NAME_SIZE      255
  18.  
  19. static int Socket;                 /* handle to socket */
  20. static int msgSocket;                 /* handle to socket */
  21. static struct hostent* pHostInfo;   /* holds info about a machine */
  22. static struct sockaddr_in Address;  /* Internet socket address stuct */
  23. static struct sockaddr_in msgAddress;  /* Internet socket address stuct */
  24. static long nHostAddress;
  25. static long msgHostAddress;
  26. static char Buffer[BUFFER_SIZE];
  27. static char msgBuffer[BUFFER_SIZE];
  28. static char strHostName[HOST_NAME_SIZE];
  29. static char msgHostName[HOST_NAME_SIZE];
  30. static int nHostPort;
  31. static int msgHostPort;
  32.  
  33. static void close_msg_socket()
  34. {
  35.         close(msgSocket);
  36.         return;
  37. }
  38. static void close_socket()
  39. {
  40.         close(Socket);
  41.         return;
  42. }
  43.  
  44. static int msg_sock_init(char* server, int port)
  45. {
  46.         strcpy(msgHostName,server);
  47.         msgHostPort=MSG_PORT;
  48.        
  49.         //creating a socket
  50.         msgSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  51.     if(msgSocket == SOCKET_ERROR)
  52.     {
  53.         printf("\nCould not make a socket\n");
  54.         return SOCKET_ERROR;
  55.     }
  56.        
  57.         /* get IP address from name */
  58.     pHostInfo=gethostbyname(msgHostName);
  59.     /* copy address into long */
  60.     memcpy(&msgHostAddress,pHostInfo->h_addr,pHostInfo->h_length);
  61.        
  62.         /* fill address struct */
  63.     msgAddress.sin_addr.s_addr=msgHostAddress;
  64.     msgAddress.sin_port=htons(msgHostPort);
  65.     msgAddress.sin_family=AF_INET;
  66.        
  67.     printf("\nConnecting to %s on port %d\n",msgHostName,msgHostPort);
  68.        
  69.     /* connect to host */
  70.     if(connect(msgSocket,(struct sockaddr*)&msgAddress,sizeof(msgAddress)) == SOCKET_ERROR)
  71.     {
  72.         printf("\nCould not connect to host\n");
  73.         return SOCKET_ERROR;
  74.     }  
  75.        
  76.         return SOCKET_GOOD;
  77. }
  78.  
  79. static int sock_init(char* server, int port)
  80. {
  81.         strcpy(strHostName,server);
  82.         nHostPort=COMM_PORT;
  83.        
  84.         //creating a socket
  85.         Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  86.     if(Socket == SOCKET_ERROR)
  87.     {
  88.         printf("\nCould not make a socket\n");
  89.         return SOCKET_ERROR;
  90.     }
  91.        
  92.         /* get IP address from name */
  93.     pHostInfo=gethostbyname(strHostName);
  94.     /* copy address into long */
  95.     memcpy(&nHostAddress,pHostInfo->h_addr,pHostInfo->h_length);
  96.        
  97.         /* fill address struct */
  98.     Address.sin_addr.s_addr=nHostAddress;
  99.     Address.sin_port=htons(nHostPort);
  100.     Address.sin_family=AF_INET;
  101.        
  102.     printf("\nConnecting to %s on port %d\n",strHostName,nHostPort);
  103.        
  104.     /* connect to host */
  105.     if(connect(Socket,(struct sockaddr*)&Address,sizeof(Address)) == SOCKET_ERROR)
  106.     {
  107.         printf("\nCould not connect to host\n");
  108.         return SOCKET_ERROR;
  109.     }  
  110.        
  111.         return SOCKET_GOOD;
  112. }
  113.  
  114. static int receive_msg_message()
  115. {
  116.         if(read(msgSocket,msgBuffer,BUFFER_SIZE) > 0)
  117.         {
  118.                 strcpy(newtext, msgBuffer);
  119.         }
  120.         return SOCKET_GOOD;
  121. }
  122.  
  123. static int receive_message()
  124. {
  125.         if(read(Socket,Buffer,BUFFER_SIZE) > 0)
  126.         {
  127.                 strcpy(newtext, Buffer);
  128.         }
  129.         return SOCKET_GOOD;
  130. }
  131.  
  132. static int send_msg_message(char *Messaggio)
  133. {
  134.         if(write(msgSocket,Messaggio,strlen(Messaggio)+1) == SOCKET_ERROR)
  135.         {
  136.                 printf("\nCould not write\n");
  137.         return SOCKET_ERROR;
  138.         }
  139.         return SOCKET_GOOD;
  140. }
  141.  
  142. static int send_message(char *Messaggio)
  143. {
  144.         if(write(Socket,Messaggio,strlen(Messaggio)+1) == SOCKET_ERROR)
  145.         {
  146.                 printf("\nCould not write\n");
  147.         return SOCKET_ERROR;
  148.         }
  149.         return SOCKET_GOOD;
  150. }
  151.  
  152. #endif



SERVER

i due thread
Codice sorgente - presumibilmente C++

  1. void *normalthread(int index) // COMMANDS THREAD
  2. {
  3.         int finish = 0;
  4.         for(; !finish;)
  5.         {
  6.                 read(Socket[index],Buffer[index],BUFFER_SIZE);
  7.                 char tempbuffer[BUFFER_SIZE];
  8.                 strcpy(tempbuffer,Buffer[index]);
  9.                 if(strcmp(tempbuffer,"finish") == 0)
  10.                 {
  11.                         finish = 1;
  12.                         printf("\nClient n°%d: DISCONNECTED\n",index);
  13.                 }
  14.                 else if(strcmp(tempbuffer, "completerefresh") == 0)
  15.                 {
  16.                         write(Socket[index], all_msg, strlen(all_msg)+1);
  17.                         position[index] = strlen(all_msg);
  18.                 }
  19.                 else if(strcmp(tempbuffer, "usernames") == 0)
  20.                 {
  21.                         write(Socket[index], usernames, strlen(usernames)+1);
  22.                 }
  23.                 fflush(stdout);
  24.         }
  25.         position[index] = 0;
  26.         close_socket(index);
  27.     pthread_exit(NULL);
  28. }
  29.  
  30. void *msgthread(int index) // MESSAGE THREAD QUESTO NON RICEVE I MESSAGGI
  31. {
  32.         int finish = 0;
  33.         for(; !finish;)
  34.         {
  35.                 read(msgSocket[index], Msg_Buffer[index],BUFFER_SIZE);
  36.         char tempbuffer[BUFFER_SIZE];
  37.         strcpy(tempbuffer,Msg_Buffer[index]);
  38.         if(strcmp(tempbuffer, "çççççrefreshççççç") == 0)
  39.         {
  40.             if(strlen(all_msg) > position[index])
  41.                         {
  42.                                 char temp[BUFFER_SIZE];
  43.                                 strcpy(temp,all_msg+position[index]);
  44.                                 write(msgSocket[index], temp, strlen(temp)+1);
  45.                                 position[index] = strlen(all_msg);
  46.                         }
  47.                         else
  48.                         {
  49.                                 write(msgSocket[index], "no_messages", strlen("no_messages"));
  50.                         }
  51.         }
  52.         if(strcmp(tempbuffer,"çççççfinishççççç") == 0)
  53.                 {
  54.                         finish = 1;
  55.                         printf("\nClient n°%d: DISCONNECTED\n",index);
  56.                 }
  57.         else
  58.         {
  59.             printf("Client n°%d: %s\n",index,tempbuffer);
  60.             strcat(all_msg,tempbuffer);
  61.             strcat(all_msg,"\n");
  62.         }
  63.                 fflush(stdout);
  64.         }
  65.         position[index] = 0;
  66.         close_socket(index);
  67.     pthread_exit(NULL);
  68. }



functions.c come socket.c del client

Codice sorgente - presumibilmente C++

  1. /*
  2.  *  functions.c
  3.  *  SDFChatServer
  4.  *
  5.  *  Created by Alberto Antonini on 24/07/10.
  6.  *  Copyright 2010 __MyCompanyName__. All rights reserved.
  7.  *
  8.  */
  9.  
  10. #ifndef H_FUNCTIONS
  11. #define H_FUNCTIONS
  12.  
  13. #import "def.c"
  14.  
  15. static char all_msg[10000];
  16. static int position[MAX_CLIENT];
  17. static int Socket[MAX_CLIENT];  /* handle to socket */
  18. static int msgSocket[MAX_CLIENT];
  19. static int ServerSocket;
  20. static int ServermsgSocket;
  21. static struct sockaddr_in Address; /* Internet socket address stuct */
  22. static struct sockaddr_in msgAddress;
  23. static int AddressSize=sizeof(struct sockaddr_in);
  24. static int msgAddressSize=sizeof(struct sockaddr_in);
  25. static char Buffer[MAX_CLIENT][BUFFER_SIZE];
  26. static char Msg_Buffer[MAX_CLIENT][BUFFER_SIZE];
  27. static char usernames[10000];
  28. static char username[MAX_CLIENT][255];
  29.  
  30. static int make_socket(int nHostPort)
  31. {
  32.         /* make a socket */
  33.     ServerSocket= socket(AF_INET,SOCK_STREAM,0);
  34.        
  35.     if(ServerSocket== SOCKET_ERROR)
  36.     {
  37.         printf("\nCould not make a socket\n");
  38.         return SOCKET_ERROR;
  39.     }
  40.        
  41.     /* fill address struct */
  42.     Address.sin_addr.s_addr=INADDR_ANY;
  43.     Address.sin_port=htons(nHostPort);
  44.     Address.sin_family=AF_INET;
  45.        
  46.     printf("\nBinding to port %d\n",nHostPort);
  47.        
  48.     /* bind to a port */
  49.     if(bind(ServerSocket,(struct sockaddr*)&Address,sizeof(Address)) == SOCKET_ERROR)
  50.     {
  51.         printf("\nCould not connect to host\n");
  52.         return SOCKET_ERROR;
  53.     }
  54.         /*  get port number */
  55.     getsockname(ServerSocket, (struct sockaddr *) &Address,(socklen_t *)&AddressSize);
  56.     printf("\nopened socket as fd (%d) on port (%d) for stream i/o\n",ServerSocket, ntohs(Address.sin_port) );
  57.        
  58.         printf("\nServer\nsin_family = %d\nsin_addr.s_addr = %d\nsin_port = %d\n", Address.sin_family, Address.sin_addr.s_addr, ntohs(Address.sin_port));
  59.        
  60.        
  61.     printf("\nMaking a listen queue of %d elements\n",QUEUE_SIZE);
  62.     /* establish listen queue */
  63.     if(listen(ServerSocket,QUEUE_SIZE) == SOCKET_ERROR)
  64.     {
  65.         printf("\nCould not listen\n");
  66.         return SOCKET_ERROR;
  67.     }
  68.         return SOCKET_GOOD;
  69. }
  70.  
  71. static int make_msg_socket(int nHostPort)
  72. {
  73.         /* make a socket */
  74.         ServermsgSocket= socket(AF_INET,SOCK_STREAM,0);
  75.        
  76.     if(ServermsgSocket== SOCKET_ERROR)
  77.     {
  78.         printf("\nCould not make a socket\n");
  79.         return SOCKET_ERROR;
  80.     }
  81.        
  82.     /* fill address struct */
  83.     msgAddress.sin_addr.s_addr=INADDR_ANY;
  84.     msgAddress.sin_port=htons(nHostPort);
  85.     msgAddress.sin_family=AF_INET;
  86.        
  87.     printf("\nBinding to port %d\n",nHostPort);
  88.        
  89.     /* bind to a port */
  90.     if(bind(ServermsgSocket,(struct sockaddr*)&msgAddress,sizeof(msgAddress)) == SOCKET_ERROR)
  91.     {
  92.         printf("\nPort alredy used or another host error\n");
  93.         return SOCKET_ERROR;
  94.     }
  95.         /*  get port number */
  96.     getsockname(ServermsgSocket, (struct sockaddr *) &msgAddress, (socklen_t *)&msgAddressSize);
  97.     printf("\nOpened socket as fd (%d) on port (%d) for stream i/o\n",ServermsgSocket, ntohs(msgAddress.sin_port) );
  98.        
  99.         printf("\nServer\nsin_family = %d\nsin_addr.s_addr = %d\nsin_port = %d\n", msgAddress.sin_family, msgAddress.sin_addr.s_addr, ntohs(msgAddress.sin_port));
  100.        
  101.     printf("\nMaking a listen queue of %d elements\n",QUEUE_SIZE);
  102.     /* establish listen queue */
  103.     if(listen(ServermsgSocket,QUEUE_SIZE) == SOCKET_ERROR)
  104.     {
  105.         printf("\nCould not listen\n");
  106.         return SOCKET_ERROR;
  107.     }
  108.         return SOCKET_GOOD;
  109. }
  110.  
  111. static void close_socket(int num)
  112. {
  113.         printf("\nClosing the socket n°%d",num);
  114.         /* close socket */
  115.         if(close(Socket[num]) == SOCKET_ERROR)
  116.         {
  117.                 printf("\nCould not close socket n°%d\n",num);
  118.         }
  119. }
  120. static void close_msg_socket(int num)
  121. {
  122.         printf("\nClosing the socket n°%d",num);
  123.         /* close socket */
  124.         if(close(msgSocket[num]) == SOCKET_ERROR)
  125.         {
  126.                 printf("\nCould not close socket n°%d\n",num);
  127.         }
  128. }
  129. #endif



Mi scuso se ho fatto un post molto lungo ma non ho a disposizione alcun altro metodo.

Grazie in anticipo!! :)

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:19
Lunedì, 09/08/2010
Mancano pezzi di codice o sbaglio? Non ho visto neanche una chiamata a fork o un riferimento a msgthread... come facciamo a capire cos'e' sbagliato?

Posta il programma completo (in allegato se e' troppo lungo) e cambia il titolo del topic in qualcosa di piu' descrittivo.

p.s. si parla di piattaforma mac, non interfaccia.

Ultima modifica effettuata da pierotofy il 09/08/2010 alle 20:20


Il mio blog: https://piero.dev
PM
Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 7:25
Martedì, 10/08/2010
Ho cercato di togliere i thread e adesso non ho ancora provato. Però ho tenuto il vecchio codice; questa volta ho rimosso solo le parti del login.
Ribadisco per chi non lo sapesse che il problema è msgthread che è come se non ricevesse nessun messaggio.

PM
Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 11:00
Sabato, 14/08/2010
Ho risolto il problema togliendo i due socket e usandone uno solo. Ho quindi rimosso uno dei due thread.
Per il momento mi posso accontentare di un socket solo... :asd:

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:48
Sabato, 14/08/2010
Mha... visto che è risolto chiudo.


Il mio blog: https://piero.dev
PM