DarkDucke 0 Denunciar post Postado Dezembro 21, 2007 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
Kandrade 7 Denunciar post Postado Dezembro 23, 2007 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