Ir ao conteúdo

sockets


Shoxsz

Posts recomendados

Postado

Olá pessoal, estou criando um programa que utiliza sockets mas estou com dificuldades no servidor, no programa cliente eu leio e envio mensagens normalmente, mas no servidor eu não consigo receber mensagens:

As variavéis usados pelo servidor


WSADATA wsa;
SOCKADDR_IN serv, cliente;
SOCKET sock, sockc;

Recebendo a mensagem depois da conexao


int r = recv(sock, buffer, 100, 0);
if(r == -1)
...

r sempre vale -1, existe alguma coisa errada no uso da função?

Postado

Oi ... Como eu não vi nem o seu cliente nem o seu servidor to te mandando um server (SIMPLES)... E fica muito tenso falar qualquer coisa pra você se você mostrou tão pouco do que fez ^_^.

// SERVER.C  ###
#include <stdio.h>
#include <conio.h>
#include <winsock.h> // Inclui o header do winsock.
#include <windows.h> // Repara que este header é para utilizarmos a função Sleep();

#pragma comment(lib, "wsock32.lib") // -l wsock32 -l Ws2_32 DLL ...
#pragma comment(lib, "Ws2_32.lib") // -l wsock32 -l Ws2_32 DLL ...

// Variíveis que recebem o valor da inicialização e criação do socket.
WSADATA data;
SOCKET winsock; // Socket NÃO inicializado apenas criado ...
SOCKADDR_IN sock; // É um Struct e dentro dele contém a configuração do socket a ser usado o ip, a porta e a família do socket.
char buffer[1024];
char buffer2[1024];
int bytes;

int main()
{ //WSAStartup - Inicializa o uso do winsock. Isso e pra definir a versao do socket
if(WSAStartup(MAKEWORD(1,1),&data) == SOCKET_ERROR){ // A sintaxe é : WSAStartup(VERSAO_DO_WINSOCK,ENDEREÇO DA VARIÁVEL)
printf("Erro ao inicializar o winsock"); // A função retorna o valor 0 (zero) quando é finalizada com sucesso ou -1, quando um erro ocorre.
return 0;
}

//socket - Inicializa o socket.
if((winsock = socket(AF_INET,SOCK_STREAM, 0)) == SOCKET_ERROR){ // A sintaxe é: socket(FAMILIA,TIPO_DE_PROTOCOLO,0)
printf("Erro ao criar socket!!!");
return 0;
}
/*
utilizo o AF_INET,
Tipo de protocolo:
SOCK_STREAM -> protocolo TCP // Utilizaremos o SOCK_STREAM
SOCK_DGRAM -> protocolo UDP
SOCK_RAW -> protocolo para RAW SOCKETS.
OBS: Assim como a função WSAStartup, esta retorna os valores: 0 (Socket inicializado) ou 1 (não inicializado).
*/

sock.sin_family = AF_INET;
sock.sin_port = htons(1234);

if(bind(winsock,(SOCKADDR*)&sock,sizeof(sock)) == SOCKET_ERROR){ // Assim como a função WSAStartup e socket, a função BIND também retorna um valor,
printf("Erro ao abrir a porta no sistema (Erro em bind)!!!"); // que por sinal, são os mesmos. Esta função é responsível por colocar o socket no modo BIND(configura-lo na porta local).
return 0; // int bind (socket, estrutura de conexao (local), tamanho da estrutura);
} // A função bind() faz o papel de abrir a porta no sistema.

listen(winsock, 1); // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão.


printf("Aguardando conexao!!!\n\n");
while((winsock = accept(winsock, NULL ,NULL)) == SOCKET_ERROR) // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão.
{ // Criamos um loop para verificarmos se houve um pedido de conexão, como a função ACCEPT retorna -1 quando não há pedidos,
Sleep(1); // o loop será feito até que o retorno seja diferente de -1, que indica um pedido de conexão.
} // Ao sair do loop, é mostrada na tela uma mensagem dizendo que houve uma conexão e em seguida o programa encerra.
// novo socket = accept (socket, estrutura de conexao, tamanho);
printf("Cliente conectado!!!\n");


// APÓS TER ESTABELICIDO A CONEXÃO É POSSIVEL ENVIAR E RECEBER DADOS OU QUALQUER OUTRA COISA DO TIPO ...

while(1){
Sleep(1);
memset(buffer2, 0, 1024);
bytes = recv(winsock, buffer2, 1024, 0);
if(bytes == -1){
printf("Conexão perdida!!!\n");
closesocket(winsock); // Fecha o Socket
WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll
getch();
return 0;
}
printf(buffer2); // Aqui é pra printa o que voce recebeu do cliente
printf("To: "); // Esse To e pra voce digitar o que quer enviar pro cliente ... Mesmo voce como servidor tem como enviar coisas ao cliente sem problemas ...
gets(buffer); // Pega o que voce digitou
printf("\n");
strcat(buffer,"\r\n"); // Da uma formatacao fulera no que voce digitou ... =P
send(winsock, buffer, strlen(buffer), 0);
// Envia pro cliente o que você digitou. Como voce (servidor) "aceitou" (e recebeu dados) o winsock possui os dados do cliente ...
// Por isso mesmo sem voce configurar o ip e porta do cliente e porcarias do tipo ... voce ainda consegue se comunicar com o cliente por causa disso
}

getch();
closesocket(winsock); // Fecha o Socket
WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll
return 0;
} // Pra rodar isso no DevC++ 4.9.9.2 vai em "Compiler Options" e digita la : -l wsock32 -l Ws2_32 e marca a opção "add the following commands when calling compiler"

Esse ai de cima foi testado e compilado.

Postado

a sim, já consegui também, é que fazia tempo que não programava sockets, é que quando eu conecto com o cliente, para ler e enviar mensagens eu devo usar o socket retornado pela função accept que é o socket do cliente, agradeço a ajuda. :)

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!