2016-01-20 3 views
-1

Я только что переместил код сокета из Linux в Windows. После некоторых изменений, чтобы заставить код работать в Windows, мой клиент, кажется, ждет у функции accept и не получает мои данные с сервера.Застрял при приеме сокета

Кодекс для моей версии клиента

WSADATA wsa; 
    SOCKET sock = 0; 
    struct sockaddr_in server; 
    packageLength = 64;//We don't need more to get all the information 
    char * buffer = new char[packageLength]; 

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { this->Die("Failed to WSA startup");} 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { 
     this->Die("Failed to create socket"); 
    } 

    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(55555); 

    if (bind(sock, (struct sockaddr *) &server, sizeof(server)) == SOCKET_ERROR) { 
     this->Die("Failed to bind the server socket"); 
    } 
    if (listen(sock, 1) < 0) { 
     this->Die("Failed to listen on server socket"); 
    } 

    SOCKET clientSocket = 0; 
    struct sockaddr_in client; 
    int size = sizeof(sockaddr_in); 

    std::cout << "Waiting for server" << std::endl; 
    clientSocket = accept(sock, (struct sockaddr *) &client, &size); //Stands here and wait 
    if (clientSocket == INVALID_SOCKET) { 
     this->Die("Failed to accept client"); 
    } 
    //Never reach here 
    std::cout << "Server accepted" << std::endl; 

И код для серверной стороны

WSADATA wsa; 
    SOCKET sock = 0; 
    struct sockaddr_in sender; 
    char* buffer = new char[this->packageLength]; 

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { 
     this->Die("Failed to WSA startup"); 
    } 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { 
     printf("Could not create socket : %d", WSAGetLastError()); 
     this->Die("Failed to create socket"); 
    } 

    memset(&sender, 0, sizeof(sender)); 
    sender.sin_family = AF_INET; 
    sender.sin_addr.s_addr = inet_addr(ip.c_str()); 
    sender.sin_port = htons(this->port); 

    //Connect to the recevier 
    if (bind(sock, (struct sockaddr *) &sender, sizeof(sender)) == SOCKET_ERROR) { 
     this->Die("Failed to connect to recevier"); 
    } 

    //Send all data 
    int amountLeft = (int)amount; 
    while (amountLeft > 0) { 
     //Send on chunk of data. //Packagesize is actually the size of the data portion 
     std::cout << "Sent" << std::endl; 
     send(sock, data, strlen(data), 0); 

     amountLeft -= packageLength; 
    } 

    std::cout << "All data is sent, socket is now closed" << std::endl; 

Сервер отправляет данные, но клиент не получает его. Я проверил так, что порты правильные, и это локальный хост, поэтому используется IP-адрес 127.0.0.1

+0

Почему клиент 'listen' &' accept'? И почему никто из них не «соединяется»? – Amit

ответ

1

Я только что перевел код сокета из Linux в Windows.

Этот код никогда не работал на какой-либо платформе. Бесцельно перемещать нерабочий код.

Мой клиент ...

Там нет клиента. Это не клиент и сервер. Это два сервера.

... похоже, ждет accept() функция.

Нет такой вещи, как клиент, ожидающий функции accept(). accept() предназначен для серверов, а не для клиентов. Ты серьезно возвращаешься сюда. Сервер должен позвонить listen() и accept(); клиент должен позвонить по телефону connect().

Смежные вопросы