Programación General > Visual C++

 Sockets Udp

<< < (2/3) > >>

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, &#34;%8d&#34;, d-&#62;tam);      sendto(sock, buffers, sizeof(buffers) - 1,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);      sendto(sock, (const char*)d-&#62;buffer,d-&#62;tam,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);      proceso-&#62;SuspendThread();  }  ExitThread(0);  return 0;  } void CARToolkitPPCDlg::OnIniciar() {  m_renderizar=true;  render-&#62;ShowWindow(true);  render-&#62;SetFocus();  GXResume();  render-&#62;SetForegroundWindow();      int res=SHFullScreen(render-&#62;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(&#34;Initiating error&#34;);    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(&#34;Creating socket error&#34;);    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(&#34;Bind error&#34;);    exit(1);  }  while (0!=listen(sock,0)){}  dialogSock=accept(sock,(struct sockaddr*)0, 0);  if(dialogSock==SOCKET_ERROR) {    printf(&#34;Accept error&#34;);    exit(1);  }*/  ///Fin de sockets a pelo*/  void **tmp = new void*[2];  tmp[0]=(void *)sock;  tmp[1]=app-&#62;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-&#62;renderFrame(mf);  }  ExitThread(0);  return 0;  } void CARToolkitPPCDlg::OnIniciar() {  m_renderizar=true;  bool cycle = true;  render-&#62;ShowWindow(true);  render-&#62;SetFocus();  GXResume();  render-&#62;SetForegroundWindow();      int res=SHFullScreen(render-&#62;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(&#34;Initiating error&#34;);    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(&#34;Creating socket error&#34;);    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

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa