Imperfeccion en la transmisión con sockets de flujo.

Iniciado por lapras, 4 Enero 2011, 14:18 PM

0 Miembros y 1 Visitante están viendo este tema.

lapras

#10
Bueno. Ya que nadie entiende lo que se pregunta lo voy a repetir de otra manera.
Segun wikipedia:
CitarTCP
El protocolo garantiza que los datos serán entregados en su destino sin errores y en el mismo orden en que se transmitieron.
Lo que significa que si envió los datos por TCP tienen que llegar seguro correctamente.
Como dice esta pagina(http://www.fismat.umich.mx/mn1/manual/node24.html):
CitarSocket de flujo
da un flujo de datos de dos vías, confiable, y sin duplicados sin límites de grabación. El flujo opera en forma parecida a una conversación telefónica. El tipo del socket es SOCK_STREAM, el cual en el dominio de Internet usa TCP (Transmission Control Protocol).
SOCK_STREAM usa el protocolo TCP lo que significa que la cadena "hola" tiene que llegar por cojones al ordenador opuesto(de hecho en ocasiones si que llega).
Mi pregunta es: ¿Por que demonios no llega?¿Se debe a la recepción?¿Wikipedia miente?¿Hay interferencias?¿los extraterrestres están jodiéndome manipulando los datos?
XD espero que ahora se entienda mejor

PD: gracias por el link Sagrini pero no se a que viene eso.

Khronos14

tuket, el protocolo TCP/IP no falla. Lo que falla son los programas, o el cliente o el servidor.

Saludos.


ukol

#13
Te faltó cerrar el socket(closesocket/shutdown en wsock) quizá sea eso(código 1).
http://msdn.microsoft.com/en-us/library/bb530744%28v=VS.85%29.aspx

Edito: Por cierto, en el segundo código no miras si da error, si devuelve -1 miras el errno con strerror(errno) y te hubiera dado mas información de lo que pasa. Que lo sepas pa la próxima, en windows no se como se hace pero seguro hay forma.

lapras

Nada ya esta solucionado dejo el código cambiado por si a alguien le interesa:
Código (cpp) [Seleccionar]
#include<windows.h>
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<sys/types.h>
#include<winsock.h>
#include<conio.h>

int main(){
    {
        WSADATA wsaData;   /* Si esto no funciona */
        //WSAData wsaData; /* prueba esto en su lugar */

        if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) 
        {
            fprintf(stderr, "WSAStartup failed.\n");
            exit(1);
        } 
    }
    ///////////////////////////////////////////////////////////////////
   
   
   
   
    struct sockaddr_in my_addr, they_addr;
    SOCKET sockfd, newfd;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1){
           printf("error en socket");
           std::cin.get();
           exit(-1);
           }
   
    my_addr.sin_family = AF_INET;         
    my_addr.sin_port = htons(54336);       
                                             
    if(my_addr.sin_addr.s_addr = htonl(INADDR_ANY)==-1){
            printf("error en ip\n");
            std::cin.get();
            exit(-1);
            }
    memset(&(my_addr.sin_zero), '\0', 8);
                                             
    if(bind(sockfd, (struct sockaddr *)&my_addr,  sizeof(struct sockaddr))==-1){
        printf("error en bind()");
        std::cout<<WSAGetLastError()<<std::endl;
        std::cin.get();
        exit(-1);
    }
    if(listen(sockfd, 10)==-1){
        printf("error en listen()");
        getch();
        exit(-1);
    }
    int bytes_sent;
    int size_sockaddr=sizeof(sockaddr);
    while(1){
    newfd=accept(sockfd,(struct sockaddr *)&they_addr, &size_sockaddr);
   
    //send(newfd, "hola", 5, 0);
    bytes_sent=send(newfd, "mola", 5, 0);
    closesocket(newfd);
    }                       
    WSACleanup();
    printf("todo en orden\n");
    getchar();
}