Nylon Tecnologia
Mudamos para um dominio proprio.

Acesse nosso novo forum.

http://crawlersnetwork.com/

[tutorial] socket em c - servidor (windows)

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[tutorial] socket em c - servidor (windows)

Mensagem por hacker fts315 em Qua Set 05, 2012 11:50 pm

e ae galera nesse tutorial vou ensinar como criar um servidor e cliente em c e c++ usando sockets q fica na biblioteca winsock2.h, vamos começar criando um servidor para isso vamos declarar a biblioteca winsock2.h

Código:
#include <stdio.h>
#include <winsock2.h>

int main(void)
{
}

lembrando q alguns compiladores ou IDE agente vai ter q linkar o lib wsock32, alguns compiladores aceita a diretiva #pragma comment e passamos como argumento para comment (lib, "wsock32")

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
}

mais nem sempre esse treco funciona '-' , outra maneira para isso e ir na configuraçao da IDE e add -l wsock32 em linker ou linkagem, ou compilar pelo prompt caso a sua IDE use o gcc basta compilar pelo prompt adicionando -l wsock32 no final, tipo assim

gcc fts.c -o hack.exe -l wsock32

bom antes de tudo temos q saber oq agente vai criar, no caso aq vai ser um servidor q vai espera uma conexao e dpois exibir uma mesagem e desconectar, ja declaramos a biblioteca agora vamos criar o socket, para isso criamos uma variavel de tipo inteiro e atribuimos a ela a funçao socket, na funçao socket passamos como argumento a arquitetura do socket (family), o tipo de conexao, e protocolo, vamos usar AF_INET na arquitetura e SOCK_STREAM na conexao e protocolo tcp q e IPPROTO_TCP

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
}

ja q o socket foi criado agente tambem tem q fechar ele para isso vamos usar closesocket e passar como argumento a variavel q atribuimos a ele

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  closesocket(socket1);
}


ate agora criamos apenas o socket mais isso nao vai fazer ele se conectar a algo ou algo se conectar a ele, para isso vamos ter q colocar o endereço porta e arquitura e dizer q esse socket vai ficar esperando uma conexao, vamos por partes vamos colocar um endereço, porta e arquitetura, para agente fazer isso temos q usar uma estrutura chamada sockaddr_in para poder usar basta declarar ela, no caso eu chamei essa de local e declarei ela embaixo da variavel socket1

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;
  struct sockaddr_in local;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  closesocket(socket1);
}

ja declaramos a estrutara agora basta atribuir a ela sin_family e AF_INET, sin_addr.s_addr e INADDR_ANY (isso e qualquer ip), sin_port e a porta vou usar a 315 na porta agente tem q usar uma funçao q e htons


Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;
  struct sockaddr_in local;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  closesocket(socket1);
}

agora vamos usar duas funçoes q sao bind e listen, no bind agente vai passar como argumento o socket, depois a nossa estrutura sockaddr (tambem tem q usar typecast aq para converter), e o tamanho do sockaddr

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;
  struct sockaddr_in local;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  bind(socket1,(struct sockaddr *)&local,sizeof(local));
  closesocket(socket1);
}

na funçao listen agente passa como argumento o socket e quantidade de conexao

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1;
  struct sockaddr_in local;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  bind(socket1,(struct sockaddr *)&local,sizeof(local));
  listen(socket1,2);

  closesocket(socket1);
}

agora so falta aceitar a conexao e ativar o serviço WSA, para aceitar a conexao temos q criar mais uma variavel do tipo inteiro no meu caso vou chamar de tam e uma outra estrutura sockaddr_in q eu vou chamar de remoto, depois usamos a funçao accept e passamos como argumento o socket a estrutura remoto (temos q usar typecast aq tambem), e a variavel

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1, tam;
  struct sockaddr_in local;
  struct sockaddr_in remoto;

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  bind(socket1,(struct sockaddr *)&local,sizeof(local));
  listen(socket1,2);
  accept(socket1,(struct sockaddr *)&remoto,&tam);

  closesocket(socket1);
}

agora so falta ativar o serviço wsa para funcionar, para isso criamos uma variavel do tipo WSADATA e usamos a funçao WSAStartup e passamos como argumento MAKEWORD(2,0) e a nossa variavel do tipo WSADATA

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1, tam;
  struct sockaddr_in local;
  struct sockaddr_in remoto;

  WSADATA wsa;
  WSAStartup(MAKEWORD(2,0),&wsa);

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  bind(socket1,(struct sockaddr *)&local,sizeof(local));
  listen(socket1,2);
  accept(socket1,(struct sockaddr *)&remoto,&tam);

  closesocket(socket1);
}

eu tambem coloquei um printf depois do accept assim q conectar exibe a massagem, so lembrando tambem q eu uso o prompt para compilar minhas sources entao eu nao precisa me preocupar da janela fechar quando executar o programa caso vc execute direto tem q colocar um system("pause") no final do codigo

Código:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "wsock32")

int main(void)
{
  int socket1, tam;
  struct sockaddr_in local;
  struct sockaddr_in remoto;

  WSADATA wsa;
  WSAStartup(MAKEWORD(2,0),&wsa);

  socket1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  local.sin_family = AF_INET;
  local.sin_addr.s_addr = INADDR_ANY;
  local.sin_port = htons(315);

  bind(socket1,(struct sockaddr *)&local,sizeof(local));
  listen(socket1,2);
  accept(socket1,(struct sockaddr *)&remoto,&tam);
 
  printf("conecto - server by hacker fts315");

  closesocket(socket1);
}

para testa basta usar o telnet mesmo, abra o prompt e digite

telnet 127.0.0.1 315

depois vou fazer a segunda parte desse tutorial ensinado como fazer o cliente

by hacker fts315


[Você precisa estar registrado e conectado para ver esta imagem.]
avatar
hacker fts315
Membro

Mensagens : 53
Pontos : 4161
Reputação : 32
Data de inscrição : 12/08/2012

Ver perfil do usuário http://endoffile.umforum.net

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum