Avatar billede d34c0n Praktikant
18. april 2006 - 17:16 Der er 22 kommentarer og
1 løsning

Ang msdn's client sample (winsock2)

jeg har et problem med denne code sample fra msdn..
den vil kun connecte til "127.0.0.1" (localhost), og det kan jeg ikke bruge til noget..

prøv fx at ændre den port og addr til noget andet så gider den ikke... altså det er ved connect()

WSAGetLastError returnerer med 10049

hvordan kan jeg løse det?

------

#include <stdio.h>
#include "winsock2.h"

void main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

    // Connect to a server.
    sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
    }

    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";

    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    if ( bytesRecv == 0 ||
        (bytesRecv == SOCKET_ERROR &&
        WSAGetLastError()== WSAECONNRESET ))
    {
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        if ( bytesRecv == -1 )
        {
            printf( "Connection Closed.\n");
            break;
        }
        if (bytesRecv < 0)
            return;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }

    WSACleanup();
    return;
}
Avatar billede arne_v Ekspert
18. april 2006 - 17:37 #1
er det en host som eksisterer du connecter til og lytter den paa porten ?
Avatar billede d34c0n Praktikant
18. april 2006 - 17:45 #2
jep det gør den.. jeg kan ikke se hvad der er galt??
Avatar billede fiil123 Nybegynder
18. april 2006 - 18:11 #3
WSAEADDRNOTAVAIL
10049:

Cannot assign requested address.
The requested address is not valid in its context. This normally results from an attempt to bind to an address that is not valid for the local computer. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote computer (for example, address or port 0).
Avatar billede fiil123 Nybegynder
18. april 2006 - 18:16 #4
#include <stdio.h>
#pragma comment( lib, "ws2_32")
#include "winsock2.h"

void main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

    // Connect to a server.
    sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "86.52.122.241" );
    clientService.sin_port = htons( 9000 );

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
    }

    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";

    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    if ( bytesRecv == 0 ||
        (bytesRecv == SOCKET_ERROR &&
        WSAGetLastError()== WSAECONNRESET ))
    {
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        if ( bytesRecv == -1 )
        {
            printf( "Connection Closed.\n");
            return;
        }
        if (bytesRecv < 0)
            return;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }

    WSACleanup();
    return;
}
Avatar billede fiil123 Nybegynder
18. april 2006 - 18:16 #5
Det fungere fint her! Har dog lige rettet en lille "fejl" men den skulle ikke have betydning for om du kan lave en forbindelse eller ej
Avatar billede d34c0n Praktikant
18. april 2006 - 18:29 #6
her er den jeg har lavet
http://nse2005se.1go.dk/nsClient.zip

virker den hos dig?

ps. det eksemplar du gav der den lukker ned lige efter den har printet "Bytes recv....
Avatar billede d34c0n Praktikant
18. april 2006 - 18:32 #7
nå ser ikke ud til jeg kan uploade noget :)
Avatar billede d34c0n Praktikant
18. april 2006 - 18:33 #8
og skal det ikke være en while loop :

(if ( bytesRecv == 0 ||
        (bytesRecv == SOCKET_ERROR &&
        WSAGetLastError()== WSAECONNRESET ))

sådan at den hele tiden modtager data..
Avatar billede d34c0n Praktikant
18. april 2006 - 18:41 #9
den lukker efter printf("Bytes sent"... mente jeg.. og den modtager ingen data?
Avatar billede fiil123 Nybegynder
18. april 2006 - 18:46 #10
Hvad er det du skal bruge?
Avatar billede fiil123 Nybegynder
18. april 2006 - 18:56 #11
Nej det skal ikke være i en while løkke. Det er ikke sådan du får den til at modtage data hele tiden
Avatar billede d34c0n Praktikant
18. april 2006 - 19:00 #12
jeg skal bare lave en klient som connecter til en addr og som printer når den modtager data..
Avatar billede fiil123 Nybegynder
18. april 2006 - 19:29 #13
Ja men den skal jo også modtage noget data ikke? Hvad for data skal den modtag en fil eller hvad?
Avatar billede fiil123 Nybegynder
18. april 2006 - 19:34 #14
Hvor nu læste jeg lige efter... Og det at den lukker ned er jo også helt korrekt. Lige nu er programmet så ledes at det connceter til serveren og sender "Client: Sending data." og modtager så noget data fra serveren og lukker ned!
Avatar billede d34c0n Praktikant
19. april 2006 - 12:02 #15
jamen den skal gerne holde sig connected hele tiden og hver gang den modtager data skal den lave en printf("%s\n", data) hvis du forstår.. den modtager bare tekst.
Avatar billede fiil123 Nybegynder
19. april 2006 - 15:33 #16
Dette er det der modtager og sender:
// Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";

    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    if ( bytesRecv == 0 ||
        (bytesRecv == SOCKET_ERROR &&
        WSAGetLastError()== WSAECONNRESET ))
    {
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        if ( bytesRecv == -1 )
        {
            printf( "Connection Closed.\n");
            return;
        }
        if (bytesRecv < 0)
            return;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }
Det skal du så bare smide i en løkke. Altså modtage delen ( recv() )!! Har du fået den til at connect?
Avatar billede d34c0n Praktikant
20. april 2006 - 21:30 #17
hmm okay men nej den gider ikke connecte..
addr: 81.7.185.36
port: 202

prøv du
Avatar billede d34c0n Praktikant
20. april 2006 - 21:30 #18
man kan sagtens connecte til den addr og port via telnet.. men gennem mit program får jeg stadig error code 10049
Avatar billede fiil123 Nybegynder
21. april 2006 - 16:36 #19
Har du en firewall på?
Avatar billede d34c0n Praktikant
23. april 2006 - 00:40 #20
jep men det gør ingen forskel at slå den fra.. det har jeg prøvet :(
Avatar billede d34c0n Praktikant
23. april 2006 - 00:41 #21
det er også lige meget fandt en socket class så im happy
Avatar billede fiil123 Nybegynder
23. april 2006 - 08:49 #22
Oki lyder bare mærkeligt at du ikke kan connecte med det som er herinde! Men hvis du har fundet noget der virker er det jo all good!
Avatar billede d34c0n Praktikant
16. maj 2006 - 15:08 #23
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester