Ir para conteúdo

Powered By

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DarkDucke

com socket!

Recommended Posts

Galera, sou iniciante em C, fiz um server em delphi e um client em C

com alguns exemplos que achei na net...

 

consegui fazer os dois se comunicarem, porém estou com alguns problemas no client...

um deles é o BUFFER_SIZE que tenho que definir um valor fixo...

e tem comandos que retorna um conteudo grande para fazer um menu no client,

tenho que fica dando enter pra receber o restante das mensagens....

e tb tem hora que eu envio a mensagem e se não der ENTER não aparece no client,

aqui dexo o meu prog client em C para que vocês possam me ajudar, estou usando o DEV-C++.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>


#define BUFFER_SIZE 256
#define EXIT_CALL_STRING "FECHACON"

int remote_socket = 0;
int message_length = 0;

unsigned short remote_port = 0;

char remote_ip[32];
char message[BUFFER_SIZE];


struct sockaddr_in remote_address;

WSADATA wsa_data;


/* Exibe uma mensagem de erro e termina o programa */
void msg_err_exit(char *msg)
{
	fprintf(stderr, msg);
	system("PAUSE");
	exit(EXIT_FAILURE);
}


int main(int argc, char **argv)
{
	if (WSAStartup(MAKEWORD(2, 0), &wsa_data) != 0)
		msg_err_exit("WSAStartup() failed\n");

	printf("IP do servidor: ");
	scanf("%s", remote_ip);
	fflush(stdin);

	printf("Porta do servidor: ");
	scanf("%d", &remote_port);
	fflush(stdin);

	remote_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (remote_socket == INVALID_SOCKET)
	{
		WSACleanup();
		msg_err_exit("socket() failed\n");
	}

	// preenchendo o remote_address (servidor)
	memset(&remote_address, 0, sizeof(remote_address));
	remote_address.sin_family = AF_INET;
	remote_address.sin_addr.s_addr = inet_addr(remote_ip);
	remote_address.sin_port = htons(remote_port);


	printf("conectando ao servidor %s...\n", remote_ip);
	if (connect(remote_socket, (struct sockaddr *) &remote_address, sizeof(remote_address)) == SOCKET_ERROR)
	{
		WSACleanup();
		msg_err_exit("connect() failed\n");
	}


	printf("digite as mensagens\n");
	do
	{
		// limpa o buffer
		memset(&message, 0, BUFFER_SIZE);

		printf("msg: ");
		gets(message);
		fflush(stdin);

		message_length = strlen(message);

		// envia a mensagem para o servidor
		if (send(remote_socket, message, message_length, 0) == SOCKET_ERROR)
		{
			WSACleanup();
			closesocket(remote_socket);
			msg_err_exit("send() failed\n");
		}
		
		//RECEBE MENSAGEM DO SERVIDOR
		// limpa o buffer
		memset(&message, 0, BUFFER_SIZE);
		// recebe a mensagem do cliente
		if (select(0,remote_socket,NULL,remote_socket,0)) {
		  do{
			message_length = recv(remote_socket, message, BUFFER_SIZE, 0);
			if(message_length == SOCKET_ERROR)
			 {
			  WSACleanup();
			  closesocket(remote_socket);
			  msg_err_exit("recv() failed\n");
			 }
		   printf("%s\n tamanho da msg = %d", message, (int)message_length);
		   }while(select(0,remote_socket,NULL,remote_socket,0) == 0);
		  }
		
		
	}
	while(strcmp(message, EXIT_CALL_STRING)); // sai quando enviar um "#quit" para o servidor


	printf("encerrando\n");
	WSACleanup();
	closesocket(remote_socket);


	system("PAUSE");
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso não tem muito jeito, se voce definir um ponteiro terá o tamanho que desejar, porém ficará mais inseguro.

Voce pode usar também a função fgets que limita a quantidade de caracteres lidos.

 

um deles é o BUFFER_SIZE que tenho que definir um valor fixo...

e tem comandos que retorna um conteudo grande para fazer um menu no client,

 

 

Isso acontece porque tem aquele gets dentro do loop que sempre espera uma entrada antes de receber algo.

O que voce precisa na verdade?

O cliente só recebe mensagens?

 

tenho que fica dando enter pra receber o restante das mensagens....

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.