Red de conocimiento informático - Computadora portátil - Problemas de programación de redes en lenguaje C

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_PORT 5150

#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;

}

}

}

}//

// 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.

//

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>

devuelve 0;

}