Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;
}
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?