Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

joao.palma

Usar o protocolo UDP[Sockets C++]

Mensagens Recomendadas

joao.palma    0
joao.palma

Boas, pessoal tenho este código aqui em baixo que usa protocolo TCP! e eu queria passar a usar UDP... O problema é que eu nunca dei sockets! não sei mesmo por onde lhe pego.... Se alguém pudesse dar umas dicas... ou indicar um bom livro!

Agradecia imenso!

Obrigado!

#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
#endif

#include <windows.h>
#include <winsock2.h>
#include <stdio.h>

SOCKET Listen;
SOCKET Connected;
#define DEFAULT_BUFFER      4096

int NET_InitializeWinsock()
{
WORD     version;
WSADATA  wsaData;
DWORD    bufferSize;
LPWSAPROTOCOL_INFO ProtocolInfo;
int      NumProtocols;

// Start winsock2 up
version = MAKEWORD(2, 0);
int error = WSAStartup(version, &wsaData);

if(error)
	return 1;

if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0)
{
	WSACleanup();
	return 1;
}

error = WSAEnumProtocols(NULL, NULL, &bufferSize);

if( (error != SOCKET_ERROR) && (WSAGetLastError() != WSAENOBUFS) )
{
	WSACleanup();
	return 1;
}

// Find the size of the buffer we need
ProtocolInfo = (LPWSAPROTOCOL_INFO) malloc(bufferSize);

if(ProtocolInfo == NULL)
{
	WSACleanup();
	return 1;
}

// Allocate memory for the protocol list and defile what
// protocols to look for
int *Protos = (int *) calloc(2, sizeof(int));
Protos[0] = IPPROTO_TCP;
Protos[1] = IPPROTO_TCP;

NumProtocols = WSAEnumProtocols(Protos, ProtocolInfo, &bufferSize);
if(NumProtocols == SOCKET_ERROR)
{
	WSACleanup();
	return 1;
}
return 0;

}

int InitSockets()
{
struct sockaddr      *Server_Address;
struct sockaddr_in   *inetServer_Address;
int Error = 0;

// Create our socket to listen
Listen = socket(AF_INET, SOCK_STREAM, 0);
if(Listen == INVALID_SOCKET)
	return -1;
// Make room for the address structure and zero it
Server_Address = (struct sockaddr*) malloc(sizeof(sockaddr));
memset((char*)    Server_Address, 0      , sizeof(sockaddr));

// Fill in the address structure
Server_Address->sa_family    = (short)AF_INET; // ERROR?!?
inetServer_Address           = (struct sockaddr_in*) Server_Address;
inetServer_Address->sin_port = htons((short) 9009);

// Bind the information to our socket
Error = bind(Listen, Server_Address, sizeof(sockaddr));
if(Error == SOCKET_ERROR)
{
	free(Server_Address);
	return -2;
}

free(Server_Address);
Server_Address = NULL;

// Listen for incoming connections. Queue only 1 connection
Error = listen(Listen,1);
if(Error == SOCKET_ERROR)
	return -3;

// Accept the connectiong
Connected = accept(Listen,NULL,NULL);
if(Connected == INVALID_SOCKET)
	return -4;

return 0;
}

void ServerProcess()
{
int ConnectionOpen = 1;
char data[2];
while(ConnectionOpen)
{
	strcpy(data, "");
	if(recv(Connected, data, 2, 0))
	{
		// Send the message back.
		data[1] = '\0';

		printf("Recieved Message \n");
		puts(data);
		if(send(Connected, data, 10, 0))
			ConnectionOpen = 0;


	}
	else
	{
		closesocket(Connected);
		ConnectionOpen = 0;
	}
}
}

int main()
{
if(NET_InitializeWinsock() != 0)
{
	printf("Critical Error\n");
	return -1;
}

if(InitSockets() != 0)
{
	printf("Critical Error\n");
	WSACleanup();
	return -2;
}

ServerProcess();
WSACleanup();
return 0;
}
//

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
apocsantos    209
apocsantos

    Bom dia,

    Por acaso isso não será para um trabalho de AED?

    Um bom livro sobre sockets... Existem às dúzias, pessoalmente li o "Beej's Guide to Network Programming, Using Internet Sockets", mas preferi usar TCP pois UDP tem claras desvantagens, entre elas a perda de packets, e torna-se mais complicado manter o programa a funcionar.

      Se realmente é para um trabalho de AED eu confirmo que nunca deste sockets, alias eu também não tive sockets nessa disciplina e tenho uma opinião muito concreta sobre os trabalhos que necessitem de matéria que não foi dada nas aulas.

      Se indicares o objectivo final do programa, talvez seja mais fácil dar-te mais indicações. Aconselho a que caso seja mesmo para um trabalho de programação que penso ser, seria interessante que aproveitasses a ajuda cá dada para perceber o código, e não apenas para "ter código" pois aproveitar código sem o perceber, quem se prejudica és tu mesmo.

Cordiais cumprimentos,

Apocsantos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

Às vezes os sockets UDP dão um jeitasso, principalmente devido ao overhead mais reduzido. De qualquer forma, como disse o Apoc, tudo depende do contexto da aplicação.

Tens aqui um link que te mostra as diferenças entre ambos, com código em c. Se perceberes bem os sockets TCP, não tens problemas. Se não perceberes, aconselho-te a tentar, caso contrário vais ter dificuldades em adaptar o código, já que é muito fácil  deixar escapar um pormenor que quebra o funcionamento desejado da aplicação.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
joao.palma    0
joao.palma

era para redes... mas nao dei sockets... o prof queria que fizesse-mos a mesma aplicação em udp e tcp... mas depois arranjei na net e ainda deu para entender....

@apocsantos eu já usei este forum mais activamente foi um suporte quando tirei o curso de informática... e posso-te dizer que nunca usei o forum para ter o codigo... nem com a finalidade de resolverem os problemas por mim... mas quando uma pessoa não tem bases no assunto, não há muito a fazer se nao pedir ajuda....

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
apocsantos    209
apocsantos

    Bom dia,

    Não foi minha intenção acusar ninguém de absolutamente nada. Este fórum existe precisamente para tirar duvidas, e ajudar. Eu por sinal vi pedidos de ajuda a pedirem "código feito" para uma disciplina semelhante" e é "habitual" haverem esse tipo de pedidos, mas não me referia ao seu caso concreto.

Cordiais cumprimentos,

Apocsantos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade