Listen a socket for client request for 10 seconds

Discussion in 'C Programming' started by silverburgh.meryl@gmail.com, Jun 18, 2007.

  1. Guest

    Hi,

    I read the following code which open a server socket for client
    request.
    However, i would like to know how can I change it so that i just
    listen for client requestfor 10 seconds, after that, it bows out?


    Code:

    // Create socket for listening for client connection requests.
    listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (listenSocket < 0) {
    std::cout << "cannot create listen socket";
    return;
    }

    // Bind listen socket to listen port. First set various fields in
    // the serverAddress structure, then call bind().
    // htonl() and htons() convert long integers and short integers
    // (respectively) from host byte order (on x86 this is Least
    // Significant Byte first) to network byte order (Most Significant
    // Byte first).
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddress.sin_port = htons(listenPort);

    if (bind(listenSocket,
    (struct sockaddr *) &serverAddress,
    sizeof(serverAddress)) < 0) {
    std::cout << "cannot bind socket";
    return;
    }

    // Wait for connections from clients.
    // This is a non-blocking call; i.e., it registers this program with
    // the system as expecting connections on this socket, and then
    // this thread of execution continues on.
    listen(listenSocket, 10);

    int count = 0;

    while (1) {
    std::cout << "Waiting for TCP connection on port " << listenPort
    << " ...\n";

    // Accept a connection with a client that is requesting one. The
    // accept() call is a blocking call; i.e., this thread of
    // execution stops until a connection comes in.
    // connectSocket is a new socket that the system provides,
    // separate from listenSocket. We *could* accept more
    // connections on listenSocket, before connectSocket is closed,
    // but this program doesn't do that.
    clientAddressLength = sizeof(clientAddress);
    connectSocket = accept(listenSocket,
    (struct sockaddr *) &clientAddress,
    &clientAddressLength);
    if (connectSocket < 0) {
    std::cout << "cannot accept connection ";
    return;
    }

    Thank you.
    , Jun 18, 2007
    #1
    1. Advertising

  2. "" <> writes:
    > I read the following code which open a server socket for client
    > request.
    > However, i would like to know how can I change it so that i just
    > listen for client requestfor 10 seconds, after that, it bows out?
    >
    >
    > Code:
    >
    > // Create socket for listening for client connection requests.
    > listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    > if (listenSocket < 0) {
    > std::cout << "cannot create listen socket";
    > return;
    > }

    [snip]

    That's C++. Why did you post to comp.lang.c?

    But before you post to comp.lang.c++, you need to be aware that
    sockets are not defined by either the C language or the C++ language.
    Try a newsgroup that deals with your operating system, most likely
    comp.unix.programmer.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Jun 18, 2007
    #2
    1. Advertising

  3. Aditya Guest

    On Jun 18, 9:52 am, ""
    <> wrote:
    > Hi,
    >
    > I read the following code which open a server socket for client
    > request.
    > However, i would like to know how can I change it so that i just
    > listen for client requestfor 10 seconds, after that, it bows out?
    >
    > Code:
    >
    > // Create socket for listening for client connection requests.
    > listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    > if (listenSocket < 0) {
    > std::cout << "cannot create listen socket";
    > return;
    > }
    >
    > // Bind listen socket to listen port. First set various fields in
    > // the serverAddress structure, then call bind().
    > // htonl() and htons() convert long integers and short integers
    > // (respectively) from host byte order (on x86 this is Least
    > // Significant Byte first) to network byte order (Most Significant
    > // Byte first).
    > serverAddress.sin_family = AF_INET;
    > serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
    > serverAddress.sin_port = htons(listenPort);
    >
    > if (bind(listenSocket,
    > (struct sockaddr *) &serverAddress,
    > sizeof(serverAddress)) < 0) {
    > std::cout << "cannot bind socket";
    > return;
    > }
    >
    > // Wait for connections from clients.
    > // This is a non-blocking call; i.e., it registers this program with
    > // the system as expecting connections on this socket, and then
    > // this thread of execution continues on.
    > listen(listenSocket, 10);
    >
    > int count = 0;
    >
    > while (1) {
    > std::cout << "Waiting for TCP connection on port " << listenPort
    > << " ...\n";
    >
    > // Accept a connection with a client that is requesting one. The
    > // accept() call is a blocking call; i.e., this thread of
    > // execution stops until a connection comes in.
    > // connectSocket is a new socket that the system provides,
    > // separate from listenSocket. We *could* accept more
    > // connections on listenSocket, before connectSocket is closed,
    > // but this program doesn't do that.
    > clientAddressLength = sizeof(clientAddress);
    > connectSocket = accept(listenSocket,
    > (struct sockaddr *) &clientAddress,
    > &clientAddressLength);
    > if (connectSocket < 0) {
    > std::cout << "cannot accept connection ";
    > return;
    > }
    >
    > Thank you.


    Hi
    Though this is not a part of C programming, still I am going since i
    have worked some stuff like this.
    For the functions u are using u need to use Unix APIs like socket.h
    and fcntl.h

    As the comments in this code specify that the accept() is a blocking
    mode function, so u need to call in in unblockking mode(Sorry if the
    terminology I am using is not very precise).

    For that take the flags in some variable stat and flip the flags to
    non blocking mode

    stat = fcntl(listenSocket, F_GETFL, NULL);
    stat |= O_NONBLOCK;
    fcntl(listenSocket, F_SETFL, stat);

    Start a loop that works for 10seconds.

    call the function accept(). If there is nothing which accept() can
    work upon , it goes to the next statement. So, u can continue with
    this for 10 seconds, apply the condition with accept() that if
    something is returned by accept(), break the loop.

    After the loop completes donot forget to flip back the flags to
    blocking mode.

    stat = fcntl(listenSocket, F_GETFL, NULL);
    stat = (~O_NONBLOCK);
    fcntl(listenSocket, F_SETFL, stat);

    This worked for me!!!

    Thanks
    Aditya
    Aditya, Jun 19, 2007
    #3
  4. Aditya said:

    <snip>

    > For the functions u are using u need to use Unix APIs like socket.h
    > and fcntl.h
    >
    > As the comments in this code specify that the accept() is a blocking
    > mode function, so u need to call in in unblockking mode


    Not necessarily true, and in fact rather misleading.

    The OP would do better to take this up in comp.unix.programmer where he
    will get expert advice.

    --
    Richard Heathfield
    "Usenet is a strange place" - dmr 29/7/1999
    http://www.cpax.org.uk
    email: rjh at the above domain, - www.
    Richard Heathfield, Jun 19, 2007
    #4
  5. Aditya Guest

    On Jun 19, 1:07 pm, Richard Heathfield <> wrote:
    > Aditya said:
    >
    > <snip>
    >
    > > For the functions u are using u need to use Unix APIs like socket.h
    > > and fcntl.h

    >
    > > As the comments in this code specify that the accept() is a blocking
    > > mode function, so u need to call in in unblockking mode

    >
    > Not necessarily true, and in fact rather misleading.
    >
    > The OP would do better to take this up in comp.unix.programmer where he
    > will get expert advice.
    >
    > --
    > Richard Heathfield
    > "Usenet is a strange place" - dmr 29/7/1999http://www.cpax.org.uk
    > email: rjh at the above domain, - www.


    Hi Richard
    Sorry if was wrong... I am just a newbie. But please do tell me if I
    am misleading. What is the place I am wrong?


    Thanks
    Aditya
    Aditya, Jun 19, 2007
    #5
  6. Ian Collins Guest

    Aditya wrote:
    > On Jun 19, 1:07 pm, Richard Heathfield <> wrote:
    >> Aditya said:
    >>
    >> <snip>
    >>
    >>> For the functions u are using u need to use Unix APIs like socket.h
    >>> and fcntl.h
    >>> As the comments in this code specify that the accept() is a blocking
    >>> mode function, so u need to call in in unblockking mode

    >> Not necessarily true, and in fact rather misleading.
    >>
    >> The OP would do better to take this up in comp.unix.programmer where he
    >> will get expert advice.
    >>

    >
    > Hi Richard
    > Sorry if was wrong... I am just a newbie. But please do tell me if I
    > am misleading. What is the place I am wrong?
    >

    The advice and the reason (what do you do when accept returns? How to
    you manage the timeout?) are both off topic! The best advice is to move
    the question to comp.unix.programmer.

    One more thing, please please don't use silly abbreviations like "u",
    they make you post hard to read.

    --
    Ian Collins.
    Ian Collins, Jun 19, 2007
    #6
  7. Aditya said:

    > On Jun 19, 1:07 pm, Richard Heathfield <> wrote:
    >> Aditya said:
    >>
    >> <snip>
    >>
    >> > For the functions u are using u need to use Unix APIs like socket.h
    >> > and fcntl.h

    >>
    >> > As the comments in this code specify that the accept() is a
    >> > blocking mode function, so u need to call in in unblockking mode

    >>
    >> Not necessarily true, and in fact rather misleading.
    >>
    >> The OP would do better to take this up in comp.unix.programmer where
    >> he will get expert advice.

    >
    > Sorry if was wrong... I am just a newbie. But please do tell me if I
    > am misleading. What is the place I am wrong?


    One of the mistakes you made was in trying to offer Unix programming
    advice in a newsgroup where it is not topical and therefore where any
    mistakes you make risk not being picked up.

    To learn about the /other/ mistake you made, ask in
    comp.unix.programmer, since it's not topical here in comp.lang.c.

    --
    Richard Heathfield
    "Usenet is a strange place" - dmr 29/7/1999
    http://www.cpax.org.uk
    email: rjh at the above domain, - www.
    Richard Heathfield, Jun 19, 2007
    #7
  8. CBFalconer Guest

    Aditya wrote:
    >

    .... snip ...
    >
    > Though this is not a part of C programming, still I am going since
    > i have worked some stuff like this. For the functions u are using
    > u need to use Unix APIs like socket.h and fcntl.h


    u hasn't been on this newsgroup for some time. His name is
    singular, so you should use the verb 'is', not are.

    I.e. don't use silly geekspeak on Usenet. It is NOT cool.

    --
    <http://www.cs.auckland.ac.nz/~pgut001/pubs/vista_cost.txt>
    <http://www.securityfocus.com/columnists/423>
    <http://www.aaxnet.com/editor/edit043.html>
    cbfalconer at maineline dot net



    --
    Posted via a free Usenet account from http://www.teranews.com
    CBFalconer, Jun 19, 2007
    #8
    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. tshad
    Replies:
    7
    Views:
    16,920
    tshad
    Mar 11, 2005
  2. 00_CP_D12
    Replies:
    3
    Views:
    8,882
    dilipv
    Feb 22, 2008
  3. Donny
    Replies:
    13
    Views:
    661
    Donny
    Aug 5, 2004
  4. Stu
    Replies:
    7
    Views:
    1,731
    Dave Thompson
    Mar 7, 2005
  5. Michael Tan
    Replies:
    32
    Views:
    943
    Ara.T.Howard
    Jul 21, 2005
Loading...

Share This Page