seja bem vindo ao forum eof, caso nao seja cadastrado se cadastre para poder visualizar todo o conteudo ^^

Participe do fórum, é rápido e fácil

seja bem vindo ao forum eof, caso nao seja cadastrado se cadastre para poder visualizar todo o conteudo ^^
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Você não está conectado. Conecte-se ou registre-se

[tutorial] socket em c - servidor (windows)

2 participantes

Ir para baixo  Mensagem [Página 1 de 1]

Kodo no Kami

Kodo no Kami
master
master

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

https://endoffile.umforum.net

c314sur1v

avatar
novato
novato

que alterações é preciso fazer para usar este programa num computador que use linux?

Kodo no Kami

Kodo no Kami
master
master

em um linux se eu nao me engano é so tirar o WSADATA e WSAStartup e ao inves de declarar winsock2.h se usa sys/socket.h , acho q usar outras bibliotecas tambem acho q tambem nao e necessario linkar wsock32

https://endoffile.umforum.net

c314sur1v

avatar
novato
novato

o sys/types.h não é preciso?

[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

Kodo no Kami

Kodo no Kami
master
master

esse sys/type ele serve para definir alguns tipos como time_t size_t etc, creio q tem q usar ele sim, dei uma olhada nesse link ai la tambem tava falando para fechar a conexao se usa close que fica na biblioteca unistd.h, tambem tem a estrutura hostent para converter host para ip q fica netdb.h, vish quantas biblioteca tem q declarar treco kkkkkkkkkk

https://endoffile.umforum.net

Conteúdo patrocinado



Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos