Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msmsms

programação com sockets em c

Mensagens Recomendadas

msmsms

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);
}

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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 ()

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

é 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$

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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 =''''''(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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);
}

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ainda está muito distante da solução, e por causa disso só vou apontar um problema no código e um problema no algoritmo

- problema de código:

do {
 scanf("%s", mensagem); // vou assumir que escreveste "XPTO"
 send(fd, mensagem, strlen(mensagem),0);
 if(strcmp(mensagem, "exit") != 0){
   int nrecv = 0;
   do{
    nrecv = recv(fd, mensagem, strlen(mensagem),0); // strlen(mensagem) == 4 !!!
    printf("%s", mensagem);
   } while(nrecv > 0);
 }
}while(strcmp(mensagem, "quit") != 0);

- problema no algoritmo

já reparaste que as mensagens enviadas por outras pessaos só aparecem quando envias algo para o servidor ? tirando essas mensagens, fica tudo novamente bloqueado até enviares nova mensagens para o servidor e ai sim, as mensagens são apresentadas ?

o que achas que deverá ser ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

ainda está muito distante da solução, e por causa disso só vou apontar um problema no código e um problema no algoritmo

- problema de código:

do {
 scanf("%s", mensagem); // vou assumir que escreveste "XPTO"
 send(fd, mensagem, strlen(mensagem),0);
 if(strcmp(mensagem, "exit") != 0){
int nrecv = 0;
do{
 nrecv = recv(fd, mensagem, strlen(mensagem),0); // strlen(mensagem) == 4 !!!
 printf("%s", mensagem);
} while(nrecv > 0);
 }
}while(strcmp(mensagem, "quit") != 0);

- problema no algoritmo

já reparaste que as mensagens enviadas por outras pessaos só aparecem quando envias algo para o servidor ? tirando essas mensagens, fica tudo novamente bloqueado até enviares nova mensagens para o servidor e ai sim, as mensagens são apresentadas ?

o que achas que deverá ser ?

não percebi o XPTO.

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

então printf antes do scanf? mas ai vou entrar uma travão de printf e scanf, não faz printf se não existit um scanf e não faz um scanf sem existir um printf

era exactamente ai que eu queria chegar. era tu ter noção que por que lado tu lhe pegues, nunca terás uma resposta imediata do sistema, terás sempre bloqueio no momento de leitura de uma mensagem do utilizador.

para resolver este tipo de problemas terás de mexer em algo chamado : threads

isto porque ão existe uma método simples de "debloquear" o scanf.

threads : sabes o que é, já viste ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

nunca escutei falar de threads pesquisei na net e parece ser algo que prescisa de ser feito e não é nenhuma função

Editado por msmsms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se não houviste falar de threads, esquece, não te metas naquilo que só por si já é difícil entrar no esquema.

deixa estar o código como está e chama-lhe feature

em C não é difícil, é simplesmente mais trabalhoso


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.