Socket: bind error...why??

Discussion in 'C Programming' started by M.Caggiano, Feb 3, 2008.

  1. M.Caggiano

    M.Caggiano Guest

    Hi!
    This code wants to simulate a possible answer of a server, to an
    application of connection aside a client.
    The server has to accept the connection and send a message with its
    name.
    The all through socket.

    The program DOESN'T HAVE errors or warnings.

    I have a problem in the function "bind" (what I have underlined with
    of the "- ") because its return value is "-1" (therefore error!).
    I don't understand because the function return this value.

    Can you help me?
    Thank's for all.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock.h>
    #include <windows.h>

    void err_fatal(char *);

    main()
    {
    /* apertura connessione lato client */
    int taddr_n, tport_n;
    struct sockaddr_in saddr, caddr;
    char *buffer;
    int result=0,addrlen=0;
    SOCKET s,s1;
    WSADATA data; // inizializzo la variabile che contiene le primitive
    di Winsock
    WORD p;
    int err=0;
    p=MAKEWORD(2,0); // creo la variabile p che contiene la versione
    della wsock32.dll
    err=WSAStartup(p,&data); // inizializzo la wsock32.dll verificandone
    la mancanza di errori

    /* creazione socket */
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(s==INVALID_SOCKET) err_fatal("socket() failed!");

    tport_n=htons(1037);
    printf("\nhtons eseguita correttamente(%d)\n",tport_n);

    saddr.sin_family=AF_INET;
    saddr.sin_port=tport_n;
    saddr.sin_addr.s_addr=INADDR_ANY; /* accetto qualsiasi indirizzo
    */

    //----------------------------------------------------------------------------------------------------------------------
    result=bind(s,(struct sockaddr *) &saddr, sizeof(saddr));
    //----------------------------------------------------------------------------------------------------------------------
    if(result==-1) err_fatal("Bind() fault");
    buffer="My server name is: MIKY";
    printf("%s",buffer);
    result=listen(s,20);

    /* accetto la connessione*/
    addrlen=sizeof(struct sockaddr_in);
    s1=accept(s,(struct sockaddr *) &caddr, &addrlen);

    send(s1,buffer,strlen(buffer),0);

    system("pause");

    /* Chiude i socket */
    WSACleanup();
    closesocket(s);
    }


    /* stampa errore */
    void err_fatal(char *mes)
    {
    printf("%s, errno=%d\n",mes,WSAGetLastError());
    perror("");
    system("pause");
    exit(1);
    }
    M.Caggiano, Feb 3, 2008
    #1
    1. Advertising

  2. In article <>,
    M.Caggiano <> wrote:

    >This code wants to simulate a possible answer of a server, to an
    >application of connection aside a client.


    >I have a problem in the function "bind" (what I have underlined with
    >of the "- ") because its return value is "-1" (therefore error!).
    >I don't understand because the function return this value.


    >Can you help me?


    bind() is not part of the standard C library. As you appear to
    be using Windows, you should be asking in a Windows programming
    newsgroup.


    > WSADATA data; // inizializzo la variabile che contiene le primitive
    >di Winsock


    > err=WSAStartup(p,&data); // inizializzo la wsock32.dll verificandone
    >la mancanza di errori


    You are possibly using the value of data before it is initialized,
    unless WSAStartup (whatever that is) happens to be storing a value
    in through the pointer that you are providing to it.

    > tport_n=htons(1037);


    > result=bind(s,(struct sockaddr *) &saddr, sizeof(saddr));


    What will happen if the port is already in use?

    > buffer="My server name is: MIKY";
    > printf("%s",buffer);


    You do not appear to be flushing the buffer, and you are not
    ending your buffers with \n . Possibly whatever you print is not
    being sent until something later flushes the buffer, such as the
    termination of the program. Consider using fflush(stdout).

    >void err_fatal(char *mes)
    >{
    > printf("%s, errno=%d\n",mes,WSAGetLastError());
    > perror("");


    With your placement of perror() before the printf(), the
    perror() could be reflecting an error result found in the
    printf() routine rather than whatever error triggered you
    calling err_fatal().

    > system("pause");
    > exit(1);
    >}



    --
    "Any sufficiently advanced bug is indistinguishable from a feature."
    -- Rich Kulawiec
    Walter Roberson, Feb 3, 2008
    #2
    1. Advertising

  3. M.Caggiano

    M.Caggiano Guest

    On 3 Feb, 23:45, -cnrc.gc.ca (Walter Roberson) wrote:
    > In article <>,
    >
    > M.Caggiano <> wrote:
    > >This code wants to simulate a possible answer of a server, to an
    > >application of connection aside a client.
    > >I have a problem in the function "bind" (what I have underlined with
    > >of the "- ") because its return value is "-1" (therefore error!).
    > >I don't understand because the function return this value.
    > >Can you help me?

    >
    > bind() is not part of the standard C library. As you appear to
    > be using Windows, you should be asking in a Windows programming
    > newsgroup.
    >
    > > WSADATA data; // inizializzo la variabile che contiene le primitive
    > >di Winsock
    > > err=WSAStartup(p,&data); // inizializzo la wsock32.dll verificandone
    > >la mancanza di errori

    >
    > You are possibly using the value of data before it is initialized,
    > unless WSAStartup (whatever that is) happens to be storing a value
    > in through the pointer that you are providing to it.
    >
    > > tport_n=htons(1037);
    > > result=bind(s,(struct sockaddr *) &saddr, sizeof(saddr));

    >
    > What will happen if the port is already in use?
    >
    > > buffer="My server name is: MIKY";
    > > printf("%s",buffer);

    >
    > You do not appear to be flushing the buffer, and you are not
    > ending your buffers with \n . Possibly whatever you print is not
    > being sent until something later flushes the buffer, such as the
    > termination of the program. Consider using fflush(stdout).
    >
    > >void err_fatal(char *mes)
    > >{
    > > printf("%s, errno=%d\n",mes,WSAGetLastError());
    > > perror("");

    >
    > With your placement of perror() before the printf(), the
    > perror() could be reflecting an error result found in the
    > printf() routine rather than whatever error triggered you
    > calling err_fatal().
    >
    > > system("pause");
    > > exit(1);
    > >}

    >
    > --
    > "Any sufficiently advanced bug is indistinguishable from a feature."
    > -- Rich Kulawiec


    Thank's so much for the printf():).

    however i've resolved the problem of the "bind()".
    All it took is changing number of port.
    Thank's so much!!!
    M.Caggiano, Feb 3, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mr. SweatyFinger
    Replies:
    2
    Views:
    1,754
    Smokey Grindel
    Dec 2, 2006
  2. Laszlo Nagy
    Replies:
    1
    Views:
    4,761
    Mark Wooding
    Jan 27, 2009
  3. Jean-Paul Calderone
    Replies:
    0
    Views:
    945
    Jean-Paul Calderone
    Jan 27, 2009
  4. Laszlo Nagy
    Replies:
    0
    Views:
    526
    Laszlo Nagy
    Feb 1, 2009
  5. Steve Holden
    Replies:
    0
    Views:
    644
    Steve Holden
    Feb 1, 2009
Loading...

Share This Page