Você está na página 1de 10

Universidade Federal de Campina Grande

Unidade Acadêmica de Engenharia Elétrica -


UAEE

Disciplina: Redes de Computadores

Programação com sockets usando DEV C++

Professor: Edmar Candeia Gurjão


ecandeia@dee.ufcg.edu.br

Campina Grande, PB.


Usando DEV C++

• DEV C++: interface de programação que utiliza compilador C++


• Utilizaremos projetos (conjunto de arquivos compilados em
conjunto)
• Arquivo  Novo  Projeto escolher Console Application
• Incluir biblioteca para sockets:
• Projeto  Parâmetros  Linker  Adicionar
• Entrar no diretório lib e escolher libwsock32.a
• Agora já é possível compilar usando o winsock2.h

UAEE-UFCG, Redes de Computadores. Campina Grande, PB.


Socket
• Ponto de comunicação e é composto de um IP e uma porta
• É necessário indicar tipo, a porta e o endereço IP e um
descritor (ou manipulador como também é conhecido) a esse
socket

• Dois Tipos de Sockets:

• Datagram Sockets (SOCK_DGRAM) também conhecidos


como sockets sem conexão, pois utilizam UDP.

• Stream Sockets (SOCK_STREAM) são fluxos de


comunicação confiáveis, sequenciados e full-duplex pois
utilizam conexão TCP.

UAEE-UFCG, Redes de Computadores. Campina Grande, PB.


Tipos de Dados

• Trabalhar com sockets é preciso usar algumas estruturas de


dados específicas
• Dois tipos de ordenamento de bytes:
• primeiro byte mais significativo (também chamado Host Byte Order)
• primeiro byte menos significativo (chamado de Network Byte Order)

• Variáveis são do tipo unsigned short int (2bytes sem sinal)

• Para converter um valor que está armazenado na variável parametro em Host


Byte Order para Network Byte Order}, pode-se usar a função
htons(parametro).

UAEE-UFCG, Redes de Computadores. Campina Grande, PB.


Tipos de Dados

// Programa que converte um numero de Host Byte Order para


// Network Byte Order

#include <winsock2.h>
#include <iostream.h> • i e j unsigned
#include <cstdlib> short int, logo
tem 16 bits (2
using namespace std; bytes)
int main(int argc, char *argv[]) {
unsigned short int i = 1, j;
• 1 armazenado
em i convertido
cout << "Inteiro em Host Byte Order " << i; para Network
Byte Order á
j = htons(i); armazenado
em j como 256.
cout << "\nInteiro em Network Byte Order " << j << "\n";

system("PAUSE");
return EXIT_SUCCESS;
}
UAEE-UFCG, Redes de Computadores. Campina Grande, PB.
Iniciando um socket
int main(int argc, char *argv[])
{
in_addr endereco_IP;

// Inicia o Winsock (esse passo é obrigatório)


WSAData wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0)
{
printf("WSAStartup() código de erro ");
return 255;
}

SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);


if (sd != INVALID_SOCKET)
{
sockaddr_in dadosSocket;
dadosSocket.sin_family = AF_INET;
dadosSocket.sin_addr.s_addr = inet_addr("198.168.62.149");
dadosSocket.sin_port = 5000;
bind(sd, (sockaddr*)&dadosSocket,sizeof(sockaddr_in));
}
else printf("Nao foi possivel abirir o socket");

}
UAEE-UFCG, Redes de Computadores. Campina Grande, PB.
Lado Servidor (espera conexões)
int main(int argc, char *argv[])
{
in_addr endereco_IP;

// Inicia o Winsock (esse passo é obrigatório)


WSAData wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0)
{
printf("WSAStartup() código de erro ");

return 255;
}

SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);


if (sd != INVALID_SOCKET)
{
sockaddr_in dadosSocket;
dadosSocket.sin_family = AF_INET;
dadosSocket.sin_addr.s_addr = inet_addr("198.168.62.149");
dadosSocket.sin_port = 5000;
bind(sd, (sockaddr*)&dadosSocket,sizeof(sockaddr_in));
listen(sd,1);
}
else cout << "Nao foi possivel abirir o socket";

}
UAEE-UFCG, Redes de Computadores. Campina Grande, PB.
Lado Servidor (espera conexões)
int main(int argc, char *argv[])
{
in_addr endereco_IP;

// Inicia o Winsock (esse passo é obrigatório)


WSAData wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0)
{
printf("WSAStartup() código de erro ");
return 255;
}

SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);


if (sd != INVALID_SOCKET)
{
sockaddr_in dadosSocket;
dadosSocket.sin_family = AF_INET;
dadosSocket.sin_addr.s_addr = inet_addr("198.168.62.149");
dadosSocket.sin_port = 5000;
bind(sd, (sockaddr*)&dadosSocket,sizeof(sockaddr_in));
listen(sd,1);
}
else cout << "Nao foi possivel abirir o socket";

}
UAEE-UFCG, Redes de Computadores. Campina Grande, PB.
Lado Servidor (espera e aceitando conexões)

//Fica esperando indefinidamente por uma nova conexão


while(1)
{
cout << "\nEsperando por conexoes\n";
sockaddr_in enderecoRemoto;
SOCKET novaConexao;
int tamanhoenderecoRemoto = sizeof(enderecoRemoto);
novaConexao = accept(sd, (sockaddr*)&enderecoRemoto,
&tamanhoenderecoRemoto);
}

closesocket(sd); //Libera o socket


closesocket(novaConexao); //Libera o socket
system("PAUSE");
return EXIT_SUCCESS;
}

UAEE-UFCG, Redes de Computadores. Campina Grande, PB.


Lado Cliente

SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);


if (sd != INVALID_SOCKET)
{
sockaddr_in socketRemoto;
socketRemoto.sin_family = AF_INET;
socketRemoto.sin_addr.s_addr = inet_addr("198.161.62.143");
socketRemoto.sin_port = 50000;
if (connect(sd, (sockaddr*)&socketRemoto, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
cout << "\nNao e contactar o servidor\n";
return 1;
}
else
cout << "\nSocket Conectado\n";
}
else
{
cout << "Nao foi possivel abirir o socket";
return 1;
}

UAEE-UFCG, Redes de Computadores. Campina Grande, PB.

Você também pode gostar