viernes, 26 de junio de 2015

cómo usar el protocolo UDP para una comunicación cliente/servidor


Servidor:
import socketserver
print("Servidor iniciado...")
class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
       
data = self.request[0].strip()
        socket = self.request[1]
       
print("{0} Ha escrito:".format(self.client_address[0]))
        print(data)
        socket.sendto(data.upper(), self.client_address)
if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()
Cliente (Cambia "localhost" por la dirección IP del servidor.):
import socket
import sys
print("Cliente iniciado...")
HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
received = sock.recv(1024)

print("Enviado: {0}".format(data))
print("Recibido: {0}".format(received))
Código de ejemplo (C)[editar]
El siguiente ejemplo muestra cómo usar el protocolo UDP para una comunicación cliente/servidor:

Servidor:
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

const int BufLen = 1024;

int main()
{
         WSADATA wsaData;
        
SOCKET RecvSocket;
         sockaddr_in RecvAddr;
         int Puerto = 2345;
         char RecvBuf[BufLen];
         sockaddr_in SenderAddr;
         int SenderAddrSize = sizeof(SenderAddr);
         WSAStartup(MAKEWORD(2,2), &wsaData);
         RecvSocket = socket(AF_INET, SOCK_DGRAM, 

IPPROTO_UDP);
         RecvAddr.sin_family = AF_INET;
         RecvAddr.sin_port = htons(Puerto);
         RecvAddr.sin_addr.s_addr = INADDR_ANY;
         bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
         recvfrom(RecvSocket,RecvBuf, BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
         printf("%s\n",RecvBuf);
         closesocket(RecvSocket);
         WSACleanup();
}
Cliente (Cambia "127.0.0.1" por la dirección IP del servidor):
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
         WSADATA wsaData;
         SOCKET SendSocket;
         sockaddr_in RecvAddr;
         int Puerto = 2345;
         char ip[] = "127.0.0.1";
         char SendBuf[] = "Hola!!!!";
         WSAStartup(MAKEWORD(2,2), &wsaData);
         SendSocket = socket(AF_INET, SOCK_DGRAM, 

IPPROTO_UDP);
         RecvAddr.sin_family = AF_INET;
         RecvAddr.sin_port = htons(Puerto);
         RecvAddr.sin_addr.s_addr = inet_addr(ip);
         sendto(SendSocket,SendBuf,strlen(SendBuf)+1,0,(SOCKADDR *) &RecvAddr,sizeof(RecvAddr));
         WSACleanup();

}

No hay comentarios:

Publicar un comentario