edo42 (Member)
Pro
Messaggi: 102
Iscritto: 30/07/2009
|
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++ |
- (void) update //funzione che aggiorna il testo
{
if(is_complete)
{
send_message("completerefresh");
receive_message();
[text setString:[NSString stringWithCString:newtext encoding:NSUTF8StringEncoding]];
}
else
{
send_msg_message("çççççrefreshççççç");
receive_msg_message();// qui c'è il problema in pratica sembra che nel punto segnalato sotto il thread non riceva niente
if(strcmp(newtext, "no_messages") != 0)
{
[text setString:[[text string] stringByAppendingString:[NSString stringWithCString:newtext encoding:NSUTF8StringEncoding]]];
}
}
}
|
socket.c contiene tutte le funzioni che uso
Codice sorgente - presumibilmente C++ |
/* * socket.c * SDFChat * * Created by Alberto Antonini on 01/06/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #include "def.c" #ifndef socket_H #define socket_H #define SOCKET_ERROR -1 #define SOCKET_GOOD 1 #define BUFFER_SIZE 100 #define HOST_NAME_SIZE 255 static int Socket; /* handle to socket */ static int msgSocket; /* handle to socket */ static struct hostent* pHostInfo; /* holds info about a machine */ static struct sockaddr_in Address; /* Internet socket address stuct */ static struct sockaddr_in msgAddress; /* Internet socket address stuct */ static long nHostAddress; static long msgHostAddress; static char Buffer[BUFFER_SIZE]; static char msgBuffer[BUFFER_SIZE]; static char strHostName[HOST_NAME_SIZE]; static char msgHostName[HOST_NAME_SIZE]; static int nHostPort; static int msgHostPort; static void close_msg_socket() { close(msgSocket); return; } static void close_socket() { close(Socket); return; } static int msg_sock_init(char* server, int port) { strcpy(msgHostName,server); msgHostPort=MSG_PORT; //creating a socket msgSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(msgSocket == SOCKET_ERROR) { printf("\nCould not make a socket\n"); return SOCKET_ERROR; } /* get IP address from name */ pHostInfo=gethostbyname(msgHostName); /* copy address into long */ memcpy(&msgHostAddress,pHostInfo->h_addr,pHostInfo->h_length); /* fill address struct */ msgAddress.sin_addr.s_addr=msgHostAddress; msgAddress.sin_port=htons(msgHostPort); msgAddress.sin_family=AF_INET; printf("\nConnecting to %s on port %d\n",msgHostName,msgHostPort); /* connect to host */ if(connect(msgSocket,(struct sockaddr*)&msgAddress,sizeof(msgAddress)) == SOCKET_ERROR) { printf("\nCould not connect to host\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } static int sock_init(char* server, int port) { strcpy(strHostName,server); nHostPort=COMM_PORT; //creating a socket Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(Socket == SOCKET_ERROR) { printf("\nCould not make a socket\n"); return SOCKET_ERROR; } /* get IP address from name */ pHostInfo=gethostbyname(strHostName); /* copy address into long */ memcpy(&nHostAddress,pHostInfo->h_addr,pHostInfo->h_length); /* fill address struct */ Address.sin_addr.s_addr=nHostAddress; Address.sin_port=htons(nHostPort); Address.sin_family=AF_INET; printf("\nConnecting to %s on port %d\n",strHostName,nHostPort); /* connect to host */ if(connect(Socket,(struct sockaddr*)&Address,sizeof(Address)) == SOCKET_ERROR) { printf("\nCould not connect to host\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } static int receive_msg_message() { if(read(msgSocket,msgBuffer,BUFFER_SIZE) > 0) { strcpy(newtext, msgBuffer); } return SOCKET_GOOD; } static int receive_message() { if(read(Socket,Buffer,BUFFER_SIZE) > 0) { strcpy(newtext, Buffer); } return SOCKET_GOOD; } static int send_msg_message(char *Messaggio) { if(write(msgSocket,Messaggio,strlen(Messaggio)+1) == SOCKET_ERROR) { printf("\nCould not write\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } static int send_message(char *Messaggio) { if(write(Socket,Messaggio,strlen(Messaggio)+1) == SOCKET_ERROR) { printf("\nCould not write\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } #endif
|
SERVER
i due thread
Codice sorgente - presumibilmente C++ |
void *normalthread(int index) // COMMANDS THREAD { int finish = 0; for(; !finish;) { read(Socket[index],Buffer[index],BUFFER_SIZE); char tempbuffer[BUFFER_SIZE]; strcpy(tempbuffer,Buffer[index]); if(strcmp(tempbuffer,"finish") == 0) { finish = 1; printf("\nClient n°%d: DISCONNECTED\n",index); } else if(strcmp(tempbuffer, "completerefresh") == 0) { write(Socket[index], all_msg, strlen(all_msg)+1); position[index] = strlen(all_msg); } else if(strcmp(tempbuffer, "usernames") == 0) { write(Socket[index], usernames, strlen(usernames)+1); } fflush(stdout); } position[index] = 0; close_socket(index); pthread_exit(NULL); } void *msgthread(int index) // MESSAGE THREAD QUESTO NON RICEVE I MESSAGGI { int finish = 0; for(; !finish;) { read(msgSocket[index], Msg_Buffer[index],BUFFER_SIZE); char tempbuffer[BUFFER_SIZE]; strcpy(tempbuffer,Msg_Buffer[index]); if(strcmp(tempbuffer, "çççççrefreshççççç") == 0) { if(strlen(all_msg) > position[index]) { char temp[BUFFER_SIZE]; strcpy(temp,all_msg+position[index]); write(msgSocket[index], temp, strlen(temp)+1); position[index] = strlen(all_msg); } else { write(msgSocket[index], "no_messages", strlen("no_messages")); } } if(strcmp(tempbuffer,"çççççfinishççççç") == 0) { finish = 1; printf("\nClient n°%d: DISCONNECTED\n",index); } else { printf("Client n°%d: %s\n",index,tempbuffer); strcat(all_msg,tempbuffer); strcat(all_msg,"\n"); } fflush(stdout); } position[index] = 0; close_socket(index); pthread_exit(NULL); }
|
functions.c come socket.c del client
Codice sorgente - presumibilmente C++ |
/* * functions.c * SDFChatServer * * Created by Alberto Antonini on 24/07/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #ifndef H_FUNCTIONS #define H_FUNCTIONS #import "def.c" static char all_msg[10000]; static int position[MAX_CLIENT]; static int Socket[MAX_CLIENT]; /* handle to socket */ static int msgSocket[MAX_CLIENT]; static int ServerSocket; static int ServermsgSocket; static struct sockaddr_in Address; /* Internet socket address stuct */ static struct sockaddr_in msgAddress; static int AddressSize=sizeof(struct sockaddr_in); static int msgAddressSize=sizeof(struct sockaddr_in); static char Buffer[MAX_CLIENT][BUFFER_SIZE]; static char Msg_Buffer[MAX_CLIENT][BUFFER_SIZE]; static char usernames[10000]; static char username[MAX_CLIENT][255]; static int make_socket(int nHostPort) { /* make a socket */ ServerSocket= socket(AF_INET,SOCK_STREAM,0); if(ServerSocket== SOCKET_ERROR) { printf("\nCould not make a socket\n"); return SOCKET_ERROR; } /* fill address struct */ Address.sin_addr.s_addr=INADDR_ANY; Address.sin_port=htons(nHostPort); Address.sin_family=AF_INET; printf("\nBinding to port %d\n",nHostPort); /* bind to a port */ if(bind(ServerSocket,(struct sockaddr*)&Address,sizeof(Address)) == SOCKET_ERROR) { printf("\nCould not connect to host\n"); return SOCKET_ERROR; } /* get port number */ getsockname(ServerSocket, (struct sockaddr *) &Address,(socklen_t *)&AddressSize); printf("\nopened socket as fd (%d) on port (%d) for stream i/o\n",ServerSocket, ntohs(Address.sin_port) ); 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)); printf("\nMaking a listen queue of %d elements\n",QUEUE_SIZE); /* establish listen queue */ if(listen(ServerSocket,QUEUE_SIZE) == SOCKET_ERROR) { printf("\nCould not listen\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } static int make_msg_socket(int nHostPort) { /* make a socket */ ServermsgSocket= socket(AF_INET,SOCK_STREAM,0); if(ServermsgSocket== SOCKET_ERROR) { printf("\nCould not make a socket\n"); return SOCKET_ERROR; } /* fill address struct */ msgAddress.sin_addr.s_addr=INADDR_ANY; msgAddress.sin_port=htons(nHostPort); msgAddress.sin_family=AF_INET; printf("\nBinding to port %d\n",nHostPort); /* bind to a port */ if(bind(ServermsgSocket,(struct sockaddr*)&msgAddress,sizeof(msgAddress)) == SOCKET_ERROR) { printf("\nPort alredy used or another host error\n"); return SOCKET_ERROR; } /* get port number */ getsockname(ServermsgSocket, (struct sockaddr *) &msgAddress, (socklen_t *)&msgAddressSize); printf("\nOpened socket as fd (%d) on port (%d) for stream i/o\n",ServermsgSocket, ntohs(msgAddress.sin_port) ); 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)); printf("\nMaking a listen queue of %d elements\n",QUEUE_SIZE); /* establish listen queue */ if(listen(ServermsgSocket,QUEUE_SIZE) == SOCKET_ERROR) { printf("\nCould not listen\n"); return SOCKET_ERROR; } return SOCKET_GOOD; } static void close_socket(int num) { printf("\nClosing the socket n°%d",num); /* close socket */ if(close(Socket[num]) == SOCKET_ERROR) { printf("\nCould not close socket n°%d\n",num); } } static void close_msg_socket(int num) { printf("\nClosing the socket n°%d",num); /* close socket */ if(close(msgSocket[num]) == SOCKET_ERROR) { printf("\nCould not close socket n°%d\n",num); } } #endif
|
Mi scuso se ho fatto un post molto lungo ma non ho a disposizione alcun altro metodo.
Grazie in anticipo!! |