Problemas de programación de redes en lenguaje C
//Código de servicio UDP// Nombre del módulo: Receiver.c
//
// Descripción:
// Este La muestra recibe datagramas UDP vinculándose a la
// interfaz y número de puerto especificados y luego bloqueándolos en una llamada recvfrom()
//
//
// Compilar:
// cl -o Receiver Receiver.c ws2_32.lib
//
// Opciones de línea de comando :
// remitente [-p:int] [-i:IP][-n:x] [-b:x]
// -p:int Puerto local
// -i:IP Dirección IP local para escuchar
// -n:x Número de veces para enviar el mensaje
// -b: x Tamaño del buffer a enviar
//
#include
#include
#include
#define DEFAULT_COUNT 25
#define DEFAULT_BUFFER_LENGTH 4096int iPort = DEFAULT_PORT // Puerto para recibir en
DWORD dwCount = DEFAULT_COUNT, // Número de mensajes para leer
dwLength = DEFAULT_BUFFER_LENGTH; // Longitud del búfer de recepción
BOOL bInterface = FALSE // Utilice una interfaz distinta a
p> p>// predeterminado
char szInterface[32]; // Interfaz para leer datagramas//
// Función: uso:
//
// Descripción:
// Imprimir información de uso y salir
//
void use()
{
printf("uso: remitente [-p:int] [-i:IP][-n:x] [-b:x]\n\n") ;
imprimirf(
" -p:int Puerto local\n");
printf(" -i:IP Dirección IP local para escuchar\n");
printf(" -n: x Número de veces para enviar el mensaje\n");
printf(" -b:x Tamaño del buffer para enviar\n\n");
ExitProcess(1);
}//
// Función: ValidateArgs
//
// Descripción:
/ / Analiza los argumentos de la línea de comando y establece algunos indicadores globales para
// indicar qué acciones realizar
//
void ValidateArgs(int argc, char **argv)
{
int i; para(i = 1; i < argc; i++)
{
si ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
cambiar (abajo (argv[i][1]))
{
case 'p': // Puerto local
if (strlen(argv[i]) > 3)
iPort = atoi(&argv[i][3]);
break;
case 'n': // Número de veces que recibir mensaje
if (strlen(argv[i]) > 3)
dwCount = atol(&argv[i][3]);
break;
case 'b': // Tamaño del búfer
if (strlen(argv[i]) > 3)
dwLength = atol(&argv[i] [3]);
break;
case 'i': // Interfaz para recibir datagramas en
if (strlen(argv[i]) > 3)
{
bInterfaz = VERDADERO;
p>
strcpy(szInterface, &argv[i][3]);
}
break;
predeterminado:
uso();
descanso;
}
}
}
}// p>
// Función: main
//
// Descripción:
// Hilo principal de ejecución. Inicializa Winsock, analiza el comando.
// argumentos de línea, crea un socket, lo vincula a una interfaz local
// y un puerto, y luego lee los datagramas.
// p>
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
char *recvbuf = NULL;
int ret,
i;
DWORD dwSenderSize;
SOCKADDR_IN remitente,
local; // Analiza los argumentos y carga Winsock
//
ValidateArgs(argc, argv); if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("¡WSAStartup falló!\n");
devuelve 1;
}
// Crea el socket y vincúlalo a una interfaz y puerto local
//
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() falló; %d\n", WSAGetLastError());
return 1;
}
local.sin_family = AF_INET;
local.sin_port = htons((short)iPort);
si (bInterface)
local.sin_addr.s_addr = inet_addr(szInterface);
else
local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("bind() falló: %d\n", WSAGetLastError());
devuelve 1;
}
// Asigne el búfer de recepción
//
recvbuf = GlobalAlloc(GMEM_FIXED, dwLength);
if (!recvbuf)
{
printf("GlobalAlloc() falló: %d\n", GetLastError());
devuelve 1;
}
// Leer los datagramas
//
for(i = 0; i < dwCount; i++)
{
dwSenderSize = sizeof(remitente);
ret = recvfrom(s, recvbuf, dwLength, 0,
(SOCKADDR *)&sender, &dwSenderSize);
if (ret == SOCKET_ERROR)
{
printf("recvfrom() falló; %d\n", WSAGetLastError());
descanso;
}
más si (ret == 0)
descanso;
más
{
recvbuf[ret] = '\0';
printf("[%s] me envió: '%s'\n",
inet_ntoa(sender.sin_addr) , recvbuf);
}
}
closesocket(s); GlobalFree(recvbuf);
WSACleanup(); p> p>
devuelve 0;
}