Prosty serwer i klient C++, part II

0

Witam,
znowu mam problem z tym nieszczęsnym winsockiem. Dzisiaj cały dzień budowałem prototypy serwera i klienta. Takie najbardziej barebone jak się da, Client ma się łączyć z serwerem o podanym IP na podanym porcie a Serwer ma tylko napisać w konsoli że ktoś się połączył. Wysyłanie danych na razie sobie odpuściłem zupełnie. W każdym razie to jest mój prototyp i jak zapewne już się domyślacie, nie działa! :D
SERWER

//SimpleServer.cpp

#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <cstdlib>

#define BACKLOG 10

using namespace std;

int main()
{
    WSADATA wsaData;

    if(WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
    {
        fprintf(stderr,"WSAStartup failed.\n");
        system("pause");
        exit(1);
    }

    ///////////////////////////////////////////////////////////////////
    int sockfd,new_fd;//deskryptory gniazd
    sockaddr_in my_addr,their_addr;//struktury informacji o adresach
    int sin_size = sizeof(struct sockaddr_in);

    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        cout<<"ERROR! Failed to create socket\n";
        system("pause");
        exit(1);
    }

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(0);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    memset( &(my_addr.sin_zero), '\0',8);

    bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));

    listen(sockfd,BACKLOG);

    new_fd = accept(sockfd,(struct sockaddr*) &their_addr/*ukryte rzutowanie w góre*/,& sin_size);
    if(new_fd==-1)
    {
        cout<<"a client failed to connect."<<endl;
    }
    else
    {
    cout<<ntohl(their_addr.sin_addr.s_addr)<<" connected!"<<endl;
    }

    system("pause");

    return 0;
}
 

KLIENT

//SimpleClient.cpp

#include <iostream>
#include <winsock2.h>
#include <cstdio>
#include <cstdlib>
#include <ws2tcpip.h>
#include <w32api.h>

using namespace std;

int main()
{
    WSADATA wsaData;
    string destination_IP;
    int destination_port;
    if(WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
    {
        fprintf(stderr,"WSAStartup failed.\n");
        system("pause");
        exit(1);
    }

    int sockfd;//deskryptor gniazda
    sockaddr_in dest_addr;//adres gniazda docelowego

    sockfd = socket(AF_INET, SOCK_STREAM,0);
    if(sockfd==-1)
    {
        cout<<"ERROR! Failed to create socket\n";
        system("pause");
        exit(1);
    }
    cout<<"Please specify the IP and port to connect to\n";
    cout<<"IP: ";
    cin>>destination_IP;
    cout<<"Port: ";
    cin>>destination_port;
    cout<<destination_IP<<" "<<destination_port<<endl;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(destination_port);
    dest_addr.sin_addr.s_addr = inet_addr(destination_IP.c_str());
    memset( &(dest_addr.sin_zero), '\0',8);

    if(connect(sockfd,(struct sockaddr *) & dest_addr,sizeof(struct sockaddr))==-1)
    {
        cout<<"ERROR! Failed to connect to "<<destination_IP<<" on port "<<destination_port<<" error "<<WSAGetLastError();
        system("pause");
        exit(1);
    }

    cout<<"Connected to "<<destination_IP<<" on port "<<destination_port<<endl;

    system("pause");

}
 

w dużej części jest bazowałem na tutku z tej strony, ale wprowadziłem pewne zmiany żeby działało na windowsie.

no więc uruchamiam klienta i serwer na moim komputerze, podaje moje IP xxx.yyy.zzz.??? oraz port 4000. Niestety, otrzymuje błąd 10061 czyli WSAECONNREFUSED ale nie wiem, dlaczego. A z pustego nawet Salomon nie naleje. :D

Proszę o pomoc, bo tkwię w martwym punkcie!

0

Łączysz się w intranecie czy przez internet?
Co mówi tcpdump?

0

Może spróbuj zrobić to przy pomocy bibliotek takich jak QT, wxWidgets,libcurl. One wszystkie mają wsparcie FTP.

1 użytkowników online, w tym zalogowanych: 0, gości: 1