Programación General > Visual C++

 Sockets Udp

(1/3) > >>

kezern:
Hola a todos. He hecho un programa servidor que envia una imagen a otro programa cliente usando sockets TCP. Me gustaría cambiarlo para que en lugar de TCP usase UDP. Lo he intentado pero no consigo que funcione.
El programa servidor es así.

--- Código: Text ---   // Initiate the winsock2 library  WORD wVersionRequested;    WSADATA wsaData;  wVersionRequested=MAKEWORD(2,2);  if (WSAStartup(wVersionRequested,&wsaData)!=0) {    printf("Initiating error");    exit(1);  }  //Definition of local and remote socket addresses  localSocketAddress.sin_family=AF_INET;  localSocketAddress.sin_port=htons(7777);  localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);  remoteSocketAddress.sin_family=AF_INET;  remoteSocketAddress.sin_port=htons(7777);  remoteSocketAddress.sin_addr.s_addr=inet_addr("192.168.0.2");   // TCP sockets    sock=socket(PF_INET,SOCK_STREAM,0);  if(sock==INVALID_SOCKET) {    printf("Creating socket error");    exit(1);  }  //Configuro los parámetros del socket  int val=5*1024*4;  int size=sizeof(int);  int flag=1;  setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));  setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));  setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));   unsigned long iostate = 1;  ioctlsocket(dialogSock,FIONBIO, &iostate); //non-blocking mode enabled    int  check=bind(sock,(sockaddr*)&localSocketAddress,sizeof(localSocketAddress));  if(check==SOCKET_ERROR) {    printf("Bind error");    exit(1);  }  while (0!=listen(sock,0)){}  dialogSock=accept(sock,(struct sockaddr*)0, 0);  if(dialogSock==SOCKET_ERROR) {    printf("Accept error");    exit(1);  }  char buffers[80];  memset(buffers, 0, sizeof(buffers)); //Clear the buffer        d=getJPG();        sprintf(buffers, "%8d", d->tam);  send(dialogSock, buffers, sizeof(buffers) - 1,0);  send(dialogSock, (const char*)d->buffer,d->tam,0);  
Y el cliente así:

--- Código: Text --- // Initiate the winsock2 library  WORD wVersionRequested;    WSADATA wsaData;  wVersionRequested=MAKEWORD(2,2);  if (WSAStartup(wVersionRequested,&wsaData)!=0) {    printf("Initiating error");    exit(1);  }   //Definition of local and remote socket addresses  localSocketAddress.sin_family=AF_INET;  localSocketAddress.sin_port=htons(7777);  localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);  remoteSocketAddress.sin_family=AF_INET;  remoteSocketAddress.sin_port=htons(7777);  remoteSocketAddress.sin_addr.s_addr=inet_addr("192.168.0.3");    // TCP sockets, creo los dos sockets    sock=socket(PF_INET,SOCK_STREAM,0);  if(sock==INVALID_SOCKET) {    printf("Creating socket error");    exit(1);  }    //Configuro cada uno de los sockets  int val=5*1024*4;  int size=sizeof(int);  int flag=1;  setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));  setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));  setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));   //Conecto los dos sockets  int  check=connect(sock, (struct sockaddr*) &remoteSocketAddress, sizeof remoteSocketAddress);check=recv (sock, buffers, sizeof(buffers)-1, 0);  int num=atoi(buffers);  char* buf;  buf=new char [num];  check=recv (sock,buf,num,0);  mf.size=num;  mf.data=(unsigned char*)buf;  Lo que he hecho ha sido cambiar el SOCK_STREAM por SOCK_DGRAM y eliminar en el servidor las funciones bind, listen y connect además de cambiar los send por sendto.
Pero no me funciona.
¿Alguien puede echarme una mano?

Eternal Idol:
No mire el codigo sino lo que comentabas. ¿Cambiaste tambien recv por recvfrom?

kezern:
Creo que si que lo he cambiado bien. He añadido las estructuras en las que tengo las direcciones y los puertos. Me extraña que en caso del cliente sea NULL pero así lo encontré en el manual que he usado.
El send es así

--- Código: Text --- send(sock, buffers, sizeof(buffers) - 1,0);send(sock, (const char*)d->buffer,d->tam,0);  Que lo he cambiado por

--- Código: Text --- sendto(sock, buffers, sizeof(buffers) - 1,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);sendto(sock, (const char*)d->buffer,d->tam,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);  
Y en el caso del recv

--- Código: Text --- check=recv (sock, buffers, sizeof(buffers)-1, 0);check=recv (sock,buf,num,0);  Y el recvfrom

--- Código: Text --- recvfrom (socky, buffers, sizeof(buffers)-1, 0, (struct sockaddr *)NULL, &lon2);check=recvfrom (socky,buf,num,0, (struct sockaddr *)NULL, &lon2);  He añadido la estructuras de direcciones tal y como sale en un manual que tengo

Eternal Idol:
El bind no tenes que eliminarlo.

Puede ser que estos ejemplos te ayuden:
http://pont.net/socket/

kezern:
Muchas gracias por tu ayuda. Ahora estoy en casa. Mañana en el trabajo intentaré a ver si consigo algo.
La página de ejemplos que has puesto al parecer son en Unix, supongo que no hay diferencia entre Unix y windows no?
Un saludo.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa