Programación General > Visual C++
Sockets Udp
Eternal Idol:
--- Cita de: "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.
--- Fin de la cita ---
Practicamente nada, Winsock necesita la inicializacion (que ya tenes) y provee mas funciones pero todas las standard las soporta.
kezern:
Nada, he puesto el bind tanto en el cliente como en el servidor y no funciona. Pego aquí debajo los dos programas completos. Lo que hace el servidor al ejecutar la función OnIniciar() es preparar el socket y pasar el apuntador al socket como parámetro a un thread. En ese thread comprimo la imagen y la mando. El cliente hace algo parecido. La función prepara el socket y lanza el thread pasándole como parametro el puntero al socket. Recoge la imagen y la muestra por pantalla. Pero el problema que tengo es que la pantalla de cliente sale negra. No se si porque no envia o porque no recibe. Intento pasarle el debug pero me dice que el breakpoint está puesto incorrectamente y lo desactiva.
El servidor es:
--- Código: Text --- UINT WINAPI threaded(LPVOID param) { void **tmp = (void **) param; SOCKET sock = (SOCKET) tmp[0]; //Se conecta un cliente char buffers[80]; memset(buffers, 0, sizeof(buffers)); //Clear the buffer while (true) { ///Creo un bucle para verificar que la función devuelve cierto. while (!WriteRGBBytesIntoJpegFile(240,320,15,(unsigned char*) tmp[1])){} //Almaceno la imagen y el tamaño en la estructura d d=getJPG(); sprintf(buffers, "%8d", d->tam); 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); proceso->SuspendThread(); } ExitThread(0); return 0; } void CARToolkitPPCDlg::OnIniciar() { m_renderizar=true; render->ShowWindow(true); render->SetFocus(); GXResume(); render->SetForegroundWindow(); int res=SHFullScreen(render->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON); //activamos el timer de renderizado SetTimer(1,10,0); SetTimer(2,400,0); ///Sockets a pelo // 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((u_short)m_local_port); localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY); remoteSocketAddress.sin_family=AF_INET; //remoteSocketAddress.sin_port=htons(7777); remoteSocketAddress.sin_port=htons((u_short)m_remote_port); // Here it's the remote machine ip address int nSize = m_ip.GetLength(); char *pAnsiString = new char[nSize+1]; memset(pAnsiString,0,nSize+1); wcstombs(pAnsiString, m_ip, nSize+1); remoteSocketAddress.sin_addr.s_addr=inet_addr(pAnsiString); // TCP sockets sock=socket(PF_INET,SOCK_DGRAM,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)); int check=bind(sock,(sockaddr*)&localSocketAddress,sizeof(localSocketAddress)); /*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); }*/ ///Fin de sockets a pelo*/ void **tmp = new void*[2]; tmp[0]=(void *)sock; tmp[1]=app->getConvertedData(); proceso = AfxBeginThread(threaded,(void*)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL);} Y el cliente
--- Código: Text --- UINT WINAPI threaded(LPVOID param) { void **tmp = (void **) param; SOCKET socky = (SOCKET) tmp[0]; //Se conecta un cliente bind (sock, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress); int length = sizeof remoteSocketAddress; getsockname (sock, (struct sockaddr *) &remoteSocketAddress, &length); char buffers[80]; memset(buffers, 0, sizeof(buffers)); //Clear the buffer bool cycle=true; int check, lon2; while (cycle) { check=recvfrom (socky, buffers, sizeof(buffers)-1, 0, (struct sockaddr *)NULL, &lon2); int num=atoi(buffers); char* buf; buf=new char [num]; check=recvfrom (socky,buf,num,0, (struct sockaddr *)NULL, &lon2); mf.size=num; mf.data=(unsigned char*)buf; render.SetFocus(); app->renderFrame(mf); } ExitThread(0); return 0; } void CARToolkitPPCDlg::OnIniciar() { m_renderizar=true; bool cycle = true; render->ShowWindow(true); render->SetFocus(); GXResume(); render->SetForegroundWindow(); int res=SHFullScreen(render->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON); int numUsers=0; //conexión desde el servidor// socketClient= new GeneralSocket(file); ///Conexión de los sockets a pelo // 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((u_short)m_local_port); localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY); remoteSocketAddress.sin_family=AF_INET; remoteSocketAddress.sin_port=htons((u_short)m_remote_port); // Here it's the remote machine ip address int nSize = m_ip.GetLength(); char *pAnsiString = new char[nSize+1]; memset(pAnsiString,0,nSize+1); wcstombs(pAnsiString, m_ip, nSize+1); remoteSocketAddress.sin_addr.s_addr=inet_addr(pAnsiString); // TCP sockets, creo los dos sockets sock=socket(PF_INET,SOCK_DGRAM,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)); bind(sock, (struct sockaddr *) &remoteSocketAddress, sizeof(remoteSocketAddress)); //unsigned long iostate = 1; //ioctlsocket(sock,FIONBIO, &iostate); /*non-blocking mode enabled*/ //Conecto los dos sockets //int check=connect(sock, (struct sockaddr*) &remoteSocketAddress, sizeof remoteSocketAddress); ///Fin de los sockets a pelo*/ void **tmp = new void*[2]; tmp[0]=(void *)sock; tmp[1]=(void *)app; proceso = AfxBeginThread(threaded,(void*)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL); }
Eternal Idol:
¿Viste los ejemplos? No tenes que usar ni listen, ni accept ni connect para nada.
kezern:
Si que he mirado los ejemplos. No los estoy usando (ninguna de las tres fuciones). Si miras en el codigo verás que están comentados.
Eternal Idol:
No voy a ponerme a ver un extracto de codigo de MFC, no tengo tiempo. Pero acabo de poner tu mismo codigo de inicializacion, cambiado las cabeceras de los ejemplos (windows.h y winsock.h) y reemplazado el close por closesocket y funcionan perfectamente bajo Windows.
PD. El cliente recibe y el servidor envia ... como se entera el servidor quien tiene que recibir y cuando ...
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa