msmsms Posted December 14, 2012 at 01:53 AM Report #487050 Posted December 14, 2012 at 01:53 AM (edited) boas preciso de ajuda para criar um ficheiro cliente.c para o seguinte servidor tentei já bastante e não consigo fazer com que um cliente se ligue a este servidor servidor (testado e a funcionar bem): #include <stdio.h> #include <string.h> #include <stdlib.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/times.h> #include <sys/select.h> #include <unistd.h> #define SERVER_BUSY "servidor ocupado\n" #define MAX_USERS 20 #define MSG_LEN 4096 int socket_listening ; /* for select() */ fd_set select_set ; int *list_of_sockets ; int max_users = MAX_USERS ; /* grows up everytime an user * got a connection. * this variable stores the * current list size.*/ int list_len = 0 ; /* the user message */ char msg[MSG_LEN+1] ; void show_help(char *name) { printf("Chatserv 1.0\n") ; printf("by Daemonio (undefinido gmail com)\n\n") ; printf("[uso] %s <port> [<max_users>]\n", name) ; } /* if it's possible to insert a socket in * the list, this function returns 0 and * 1 otherwise. */ char insert_socket_into_list(int socket) { int i ; if ( list_len == max_users ) { return 1 ; } for ( i = 0; i < max_users; i++ ) { if ( list_of_sockets[i] == -1 ) { list_of_sockets[i] = socket ; list_len++ ; break ; } } return 0 ; } /* searches for a socket in the list * and closes it. */ void remove_socket_from_list(int _sock) { int i ; for ( i = 0; i < max_users; i++ ) { if ( list_of_sockets[i] == _sock ) { close(list_of_sockets[i]) ; list_of_sockets[i] = -1 ; list_len-- ; break ; } } } /* gets the message from an user. * this message will be in `msg'. * Returns 0 if the message was delivered * succesfully and 1 if the client * has finished the connection. */ char get_message_from_socket(int _sock) { int t ; memset(msg,0x0,MSG_LEN+1) ; t = recv(_sock, msg, MSG_LEN, 0 ) ;//<-------------------------------------RECEIVE if ( t == 0 ) { remove_socket_from_list(_sock) ; return 1 ; } return 0 ; } /* after we got the message from the user, * we'll send it to all the others here. * note that an user cant send a message * to himself (list_of_sockets[i] != _sock). */ void send_message_to_all(int _sock) { int i ; for ( i = 0; i < max_users; i++ ) { if ( (list_of_sockets[i] != -1) && (list_of_sockets[i] != _sock) && (list_of_sockets[i] != socket_listening) ) { send(list_of_sockets[i], msg, strlen(msg), 0) ; } } } int main(int argc, char **argv) { int port ; int t ; struct sockaddr_in server ; struct timeval select_time ; if ( argc == 1 ) { show_help(argv[0]) ; return -1 ; } if ( argc > 2 ) { max_users = atoi(argv[2]) ; } port = atoi(argv[1]) ; socket_listening = socket(AF_INET, SOCK_STREAM, 0) ; if ( socket_listening < 0 ) { perror("socket") ; return -1 ; } server.sin_family = AF_INET ; server.sin_port = htons(port) ; server.sin_addr.s_addr = INADDR_ANY ; t = sizeof(struct sockaddr_in) ; if ( bind( socket_listening, (struct sockaddr *) &server, t ) < 0 ) { perror("bind") ; return -1 ; } if ( listen(socket_listening, 5) < 0 ) { perror("listen") ; return -1 ; } /* create the list of sockets. * for each client, there is a socket in this list. */ list_of_sockets = (int *) malloc( max_users * sizeof(int) ) ; if ( list_of_sockets == NULL ) { perror("malloc") ; return -1 ; } /* "clean up" the list. */ for ( t = 0; t < max_users; t++ ) list_of_sockets[t] = -1 ; /* you'll need a ctrl+c to break this loop */ while ( 1 ) { /* gets all the sockets and put in a * fd_set struct. */ FD_ZERO(&select_set) ; FD_SET(socket_listening, &select_set) ; for ( t = 0; list_len > 0 && t < max_users; t++ ) { if ( list_of_sockets[t] != -1 ) { FD_SET(list_of_sockets[t], &select_set) ; } } //printf("[+] Listening on %d [%d/%d] ...\n", port, list_len, max_users) ; /* select will wait 2 seconds before * returning. */ select_time.tv_sec = 2 ; select_time.tv_usec = 0 ; /* select returns: * < 0 if error. * = 0 if nothing happened * > 0 number of sockets on the sets */ if ( (t=select(FD_SETSIZE, &select_set, NULL, NULL, &select_time)) < 0 ) { perror("select") ; return -1 ; } /* wow, we have something ... */ if ( t > 0 ) { /* if it's the listening socket, we have to * accept the incoming connection and add * the new socket in the list. */ if ( FD_ISSET(socket_listening, &select_set) ) { int n ; if ( (n=accept(socket_listening, NULL, NULL)) < 0 ) { perror("accept") ; } else if ( insert_socket_into_list(n) == 1 ) { /* server is busy */ send(n,SERVER_BUSY,strlen(SERVER_BUSY),0) ; close(n) ; } continue ; } else { int i ; /* handle the incoming data. */ for ( i = 0; i < max_users; i++ ) { if ( FD_ISSET(list_of_sockets[i], &select_set) ) { if ( get_message_from_socket(list_of_sockets[i]) == 0 ) { send_message_to_all(list_of_sockets[i]) ; } } } } } } /* while */ return 0 ; } /* main */ meu cliente (não faz envio da mensagem ao recv do servidor): #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netdb.h> #define BUF_SIZE 1024 void erro(char *msg); int main(int argc, char *argv[]) { char endServer[100]; int fd, client; char envio_buffer[bUF_SIZE]; char receber_buffer[bUF_SIZE]; char nome_cliente[bUF_SIZE]; struct sockaddr_in addr, client_addr; int client_addr_size; struct hostent *hostPtr; if (argc != 4) { printf("cliente <ip endereco> <porto> <nome de utilizador>\n"); // argv[0] = cliente // argv[1] = ip endereco // argv[2] = porto // argv[3] = nome utilizador exit(-1); } strcpy(endServer, argv[1]); strcpy(nome_cliente, argv[3]); if ((hostPtr = gethostbyname(endServer)) == 0) { printf("nao consegui obter endereco.\n"); exit(-1); } bzero((void *) &addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr; addr.sin_port = htons((short) atoi(argv[2])); if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) //cria socket erro("na funcao socket"); if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0) // conecta clinte erro("na funcao Connect"); send(fd, argv[3], strlen(argv[3]),0); //ENVIAR O NOME COMO MENSAGEM AO SERVIDOR !!!!!!!!!!!!!! close(fd); } void erro(char *msg) { printf("Erro: %s\n", msg); exit(-1); } Edited December 14, 2012 at 09:51 AM by apocsantos geshi
HappyHippyHippo Posted December 14, 2012 at 06:45 AM Report #487059 Posted December 14, 2012 at 06:45 AM não estás à espera que uma pessoa leia um bloco de código sem indentação deste tamanho à procura de uma erro que não faz ideia qual é, pois não ? ao menos deverias dizer quel o erro/problema apresentado pela aplicação !!! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
apocsantos Posted December 14, 2012 at 09:33 AM Report #487062 Posted December 14, 2012 at 09:33 AM Bom dia, Duas questoes: 1º o código do servidor está incompleto não dizes qual é o erro e não o consigo compilar por estar incompleto. Qual o erro ? 2º Qual o erro que te dá no cliente ? Coloca a questão de forma mais clara. Tens na wiki alguns exemplos: Sockets muito bem explicados, que certamente te ajudam a resolver o problema. Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
msmsms Posted December 14, 2012 at 09:43 AM Author Report #487063 Posted December 14, 2012 at 09:43 AM (edited) não estás à espera que uma pessoa leia um bloco de código sem indentação deste tamanho à procura de uma erro que não faz ideia qual é, pois não ? ao menos deverias dizer quel o erro/problema apresentado pela aplicação !!! editei o post acima simplificando o meu problema está no cliente, não consigo fazer com que ele faça o envio de uma mensagem para esse servidor tal como o netcat faz bem no final do ficheiro cliente eu criei um send para enviar uma mensagem ao servidor so que o servidor nao a recebe!!!! Bom dia, Duas questoes: 1º o código do servidor está incompleto não dizes qual é o erro e não o consigo compilar por estar incompleto. Qual o erro ? 2º Qual o erro que te dá no cliente ? Coloca a questão de forma mais clara. Tens na wiki alguns exemplos: Sockets muito bem explicados, que certamente te ajudam a resolver o problema. Cordiais cumprimentos, Apocsantos testas te com o terminal do linux? eu copiei o codigo do servidor tal como deixei em cima para um ficheiro.c e compilei com gcc e esta tudo certo o meu problema esta no cliente não consigo fazer com que o servidor receba qualquer mensagem do cliente nem que seja so um oi já agora o servidor eu consegui no seguinte link: http://daemoniolabs.wordpress.com/2011/07/08/chatserv-servidor-de-chat-em-c/#comment-1043 Edited December 14, 2012 at 09:53 AM by msmsms
apocsantos Posted December 14, 2012 at 09:57 AM Report #487065 Posted December 14, 2012 at 09:57 AM Bom dia, Tentei com o gcc no cygwin. Neste momento estou a usar uma maquina windows e apesar de ter reparado que tens o servidor feito para GNU/Linux calculei que pudesse ser compilado sem problemas no cygwin, com o gcc. Viste o link que te deixei para a wiki ? Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
HappyHippyHippo Posted December 14, 2012 at 10:06 AM Report #487067 Posted December 14, 2012 at 10:06 AM ora bem ... primeiro de tudo, eu nem deveria responder devido à mudança do código. o código que tinhas inicialmente é completamente diferente do que tens agora segundo, o código que tens agora está correcto, não tens bug, e faz exactamente o que está escrito. se não faz o que queres, é porque ou não sabes o que queres, ou não fazes ideia do que o código faz e fizeste um copy-paste de código que viste na net. não vale a pena reclamares com o código ou a resposta, porque o código foi testado e corre conforme o esperado. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 10:12 AM Author Report #487068 Posted December 14, 2012 at 10:12 AM Bom dia, Tentei com o gcc no cygwin. Neste momento estou a usar uma maquina windows e apesar de ter reparado que tens o servidor feito para GNU/Linux calculei que pudesse ser compilado sem problemas no cygwin, com o gcc. Viste o link que te deixei para a wiki ? Cordiais cumprimentos, Apocsantos sim eu coloquei o exemplo do ''ler dados'' e fiquei com o cliente como deixo em baixo e ai quando tento ligar o cliente ao servidor no mesmo porto (exemplo porto 9000) responde permissao negada que já foi alguma pode-se fazer recv com o servidor e write com o cliente? não tenho de fazer o send como eu estava a fazer? penso que o problema é na função send() #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netdb.h> #define BUF_SIZE 1024 void erro(char *msg); int main(int argc, char *argv[]) { char endServer[100]; int fd, client; char envio_buffer[bUF_SIZE]; char receber_buffer[bUF_SIZE]; char nome_cliente[bUF_SIZE]; struct sockaddr_in addr, client_addr; int client_addr_size; struct hostent *hostPtr; if (argc != 4) { printf("cliente <ip endereco> <porto> <nome de utilizador>\n"); // argv[0] = cliente // argv[1] = ip endereco // argv[2] = porto // argv[3] = nome utilizador exit(-1); } strcpy(endServer, argv[1]); strcpy(nome_cliente, argv[3]); if ((hostPtr = gethostbyname(endServer)) == 0) { printf("nao consegui obter endereco.\n"); exit(-1); } bzero((void *) &addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr; addr.sin_port = htons((short) atoi(argv[2])); if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) //cria socket erro("na funcao socket"); if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0) // conecta clinte erro("na funcao Connect"); ////////////////////////////////////////////////////////////////////////////////////// //send(fd, argv[3], strlen(argv[3]),0); //PARA ENVIAR MENSAGEM NOME AO SERVIDOR MAS NAO ENVIA NADA!!!!!!! // EXEMPLO DA WIKI char palavra[bUF_SIZE]; char palavra2[bUF_SIZE]; do { scanf("%s", palavra); // envia para o servidor os dados contidos na variável “palavra” write(fd, palavra, 50); if(strcmp(palavra, "exit") != 0){ // recebe do servidor os dados e guarda-os na variável “palavra2” read(fd, palavra2, 50); printf("%s\n", palavra2); } }while(strcmp(palavra, "exit") != 0); ////////////////////////////////////////////////////////////////////////////////////// close(fd); } void erro(char *msg) { printf("Erro: %s\n", msg); exit(-1); }
apocsantos Posted December 14, 2012 at 10:12 AM Report #487069 Posted December 14, 2012 at 10:12 AM Bom dia, É impressão minha ou inicialmente o código que tinhas neste post, no cliente era uma "mistura" de winsock e sockets em unix ? Efectivamente parece-me um código "copy-past", tal como o @HappyHippyHipo referiu. Volto a insistir que vejas o que te indiquei, na wiki, porque certamente tens lá a resposta ao que precisas. Adicionalmente vê este .pdf, tens lá um exemplo muito bem explicado de um chat com sockets. Podia estar melhor, mas visto que estás "enrascado", e precisas de fazer isso funcionar rápidamente, tens nesse pdf um exemplo de chat com sockets, super simples e bem documentado. Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
msmsms Posted December 14, 2012 at 10:15 AM Author Report #487070 Posted December 14, 2012 at 10:15 AM (edited) ora bem ... primeiro de tudo, eu nem deveria responder devido à mudança do código. o código que tinhas inicialmente é completamente diferente do que tens agora segundo, o código que tens agora está correcto, não tens bug, e faz exactamente o que está escrito. se não faz o que queres, é porque ou não sabes o que queres, ou não fazes ideia do que o código faz e fizeste um copy-paste de código que viste na net. não vale a pena reclamares com o código ou a resposta, porque o código foi testado e corre conforme o esperado. apenas o codigo servidor não é meu e o codigo cliente foi todo feito por mim ate agora! eu quero fazer o cliente para o codigo servidor e sei perfeitamente o que ele faz e ele ja faz o que eu quero um chat onde se pode ligar varios clientes e as mensagens irem de uns para outros mas para isso eu preciso de fazer chegar a mensagem do meu cliente ao servidor (ao recv da função ''get_message_from_socket'') e é ao fazer esse envio de mensagem ''cliente -> servidor'' que preciso de ajuda cliente -> servidor send() -> recv () Edited December 14, 2012 at 10:19 AM by msmsms
HappyHippyHippo Posted December 14, 2012 at 10:17 AM Report #487071 Posted December 14, 2012 at 10:17 AM mas para isso eu preciso de fazer chegar a mensagem ao servido do meu cliente e é isso ai que preciso de ajuda! a mensagem chega ao servidor sem problema nenhum (foi testado). responde à minha pergunta : porque razão dizes tu que não está a chegar a mensagem ao servidor ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 10:28 AM Author Report #487074 Posted December 14, 2012 at 10:28 AM (edited) a mensagem chega ao servidor sem problema nenhum (foi testado). responde à minha pergunta : porque razão dizes tu que não está a chegar a mensagem ao servidor ? como o cliente estava de inicio não enviada nada era como se não tive-se lá o send mesmo tendo e como eu o coloquei depois com o write a consola diz permissao negada qual cliente utilizas te e qual consola? terminal 1 (servidor): linux@ubuntu:~/Área de Trabalho$ cd m linux@ubuntu:~/Área de Trabalho/m$ gcc cliente.c -o cliente linux@ubuntu:~/Área de Trabalho/m$ ./servidor 9000 terminal 2 (cliente): linux@ubuntu:~/Área de Trabalho/m$ gcc cliente.c -o cliente linux@ubuntu:~/Área de Trabalho/m$ ./cliente.c localhost 9000 nome bash: ./cliente.c: Permissão negada agora aparece permissao negada seja com send ou com write Edited December 14, 2012 at 10:33 AM by msmsms
HappyHippyHippo Posted December 14, 2012 at 10:37 AM Report #487082 Posted December 14, 2012 at 10:37 AM terminal 1 (servidor): linux@ubuntu:~/Área de Trabalho$ cd m linux@ubuntu:~/Área de Trabalho/m$ gcc cliente.c -o cliente linux@ubuntu:~/Área de Trabalho/m$ ./servidor 9000 é assim que compilas o servidor ??? ---- diz ai em que linha de código aparece : "Permissão negada" ... nenhuma, logo o erro não é de código a mensagem apresentada está relacionada com a permissão de execução do ficheiro ao nível do sistema operativo e não tem nada haver com o código. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 10:46 AM Author Report #487083 Posted December 14, 2012 at 10:46 AM é assim que compilas o servidor ??? ---- diz ai em que linha de código aparece : "Permissão negada" ... nenhuma, logo o erro não é de código a mensagem apresentada está relacionada com a permissão de execução do ficheiro ao nível do sistema operativo e não tem nada haver com o código. o servidor já está compilado faz mais de 10 dias ainda antes de me ter passado pela cabeça que fazer este chat em c pode ser algo para fazer até à morte não aparece linha no erro aparece exactamente como deixo linux@ubuntu:~/Área de Trabalho$ cd m linux@ubuntu:~/Área de Trabalho/m$ ./cliente.c localhost 9000 nome bash: ./cliente.c: Permissão negada linux@ubuntu:~/Área de Trabalho/m$
HappyHippyHippo Posted December 14, 2012 at 10:46 AM Report #487084 Posted December 14, 2012 at 10:46 AM diz ai em que linha de código aparece : "Permissão negada" ... nenhuma, logo o erro não é de código a mensagem apresentada está relacionada com a permissão de execução do ficheiro ao nível do sistema operativo e não tem nada haver com o código. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 11:05 AM Author Report #487086 Posted December 14, 2012 at 11:05 AM tens razão eu estou a obter permissao negada ate mesmo em problemas que ja tinha resolvido com sucesso quando tento correr os clientes e agora como é que resolvo isso =''''''(
HappyHippyHippo Posted December 14, 2012 at 11:21 AM Report #487089 Posted December 14, 2012 at 11:21 AM executa um ls -l e verifica se o ficheiro se encontra com permissões de execução IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 11:45 AM Author Report #487093 Posted December 14, 2012 at 11:45 AM executa um ls -l e verifica se o ficheiro se encontra com permissões de execução mudei o porto para outro numero e ja dá, deve ter hackeado com o porto que estava a usar mesmo assim ainda nao consegui o efeito ping pong o envio de informação de cliente para cliente porque o cliente fecha logo como é que contorno isso?
HappyHippyHippo Posted December 14, 2012 at 12:01 PM Report #487096 Posted December 14, 2012 at 12:01 PM o envio de informação de cliente para cliente porque o cliente fecha logo como é que contorno isso? queres que te responda a primeira coisa que me veio à cabeça ?? > não feches ... só terás de pensar : "Quando queres que o cliente feche ?" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
msmsms Posted December 14, 2012 at 12:35 PM Author Report #487101 Posted December 14, 2012 at 12:35 PM (edited) ainda nao estou a conseguir difundir a mensagem por varios clientes eu penso que está la perto mas falta-lhe um empurrão #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netdb.h> #define BUF_SIZE 1024 void erro(char *msg); int main(int argc, char *argv[]) { char endServer[100]; int fd, client; char nome_cliente[bUF_SIZE]; char mensagem[bUF_SIZE]; struct sockaddr_in addr, client_addr; int client_addr_size; struct hostent *hostPtr; if (argc != 4) { printf("cliente <ip endereco> <porto> <nome de utilizador>\n"); // argv[0] = cliente // argv[1] = ip endereco // argv[2] = porto // argv[3] = nome utilizador exit(-1); } strcpy(endServer, argv[1]); strcpy(nome_cliente, argv[3]); if ((hostPtr = gethostbyname(endServer)) == 0) { printf("nao consegui obter endereco.\n"); exit(-1); } bzero((void *) &addr, sizeof(addr)); // coloca endereço a zeros addr.sin_family = AF_INET; // define protocolo addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr; // addr.sin_port = htons((short) atoi(argv[2])); // define o porto if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) //cria socket erro("na funcao socket"); if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0) // conecta clinte erro("na funcao Connect"); ////////////////////////////////////////////////////////////////////////////////////// // TROCA DE INFORMAÇÃO do { scanf("%s", mensagem); send(fd, mensagem, strlen(mensagem),0); // envia mensagem ao servidor //send(fd, nome_cliente, strlen(nome_cliente),0); // envia nome ao servidor (quando houver recv para isso lá!) if(strcmp(mensagem, "exit") != 0){ recv(fd, mensagem, strlen(mensagem),0); // recebe mensagem do servidor } }while(strcmp(mensagem, "quit") != 0); // sair do chat ////////////////////////////////////////////////////////////////////////////////////// close(fd); } void erro(char *msg) { printf("Erro: %s\n", msg); exit(-1); } Edited December 14, 2012 at 12:36 PM by msmsms
msmsms Posted December 14, 2012 at 02:11 PM Author Report #487113 Posted December 14, 2012 at 02:11 PM eu estou neste estado e não consigo fazer com que o clientes recebam as mensagem // TROCA DE INFORMAÇÃO do { scanf("%s", mensagem); // para os clientes escreverem mensagens send(fd, mensagem, strlen(mensagem),0); // envia mensagem ao servidor //send(fd, nome_cliente, strlen(nome_cliente),0); // envia nome ao servidor (quando houver recv para isso lá!) if(strcmp(mensagem, "exit") != 0){ int nrecv = 0; do{ nrecv = recv(fd, mensagem, strlen(mensagem),0); // recebe mensagem do servidor printf("%s", mensagem); // imprime a mensagens dos clientes } while(nrecv > 0); } }while(strcmp(mensagem, "quit") != 0); // sair do cha
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now