Programación General > Visual C++
Sockets Udp
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
[#] Página Siguiente
Ir a la versión completa