Socket programming problem: can't generate output in server socket

Discussion in 'C Programming' started by ferbar, Jun 21, 2005.

  1. ferbar

    ferbar Guest

    Hello all,

    This may sound pretty basic stuff.. but I'm working on a socket example
    whose client seems to work fine, but the server doesn't send to the
    client the expected result. The problem is that I want to trace what
    the server socket is doing, but I'm unable to see any of my fprintf or
    printf stuff.

    Please take a look to the example:

    #include <stdlib.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>

    //x ------------------------------------------------------------ x

    #define MAXLINE 4096 /* max text line length */

    int main(int argc, char **argv)
    int listenfd, connfd; // socket file descriptor
    struct sockaddr_in servaddr; // IPv4 socket address structure
    char buff[MAXLINE];
    // ********************
    char file[32];
    FILE *fp;

    if ((fp = fopen(file, "w")) == NULL)
    printf("Can't open %s\n", file);
    fprintf(fp, "\nFirst step...");
    // ********************

    listenfd = socket(AF_INET, SOCK_STREAM, 0); // call to socket function

    bzero(&servaddr, sizeof(servaddr)); // initialization of socket
    structure to 0
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(9877); // Port in host byte order must be
    // to network byte order
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // INADDR_ANY - wild card
    // This tells the kernel to choose the IP address
    bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    fprintf(fp, "\nWaiting for connection, BEFORE call to listen()");
    listen(listenfd, 5);
    fprintf(fp, "\nWaiting for connection, AFTER call to listen()");
    for ( ; ; ) {

    if (connfd = accept (listenfd, NULL, NULL) < 0)
    fprintf(fp, "\nERROR on accept");
    fprintf(fp, "\nSUCCESS on accept");
    // We are not interested in knowing the identity of the client
    // Therefore, 2nd and 3rd param. to NULL
    strcpy(buff, "Output to the client");
    snprintf(buff, sizeof(buff), "%%" );
    write(connfd, buff, strlen(buff));
    // exit(0);

    // ********************
    // ********************

    As you can see, there are many fprintf instructions which work fine in
    my socket client but not in the server. I guess I'm missing some
    conceptual stuff here. Any idea?


    ferbar, Jun 21, 2005
    1. Advertisements

  2. ferbar

    Jack Klein Guest

    Not a standard C header.
    Not a standard C header.
    Not a standard C header.
    Not a standard C header.


    Your question and code are not topical here, they are full of
    non-standard extensions that are not part of the language. The C
    language has no built-in support for any sort of networking.

    Your best place to take this is most like but it is highly recommended that you read their socket FAQ before
    asking networking questions.
    Jack Klein, Jun 21, 2005
    1. Advertisements

  3. Thanks for the reference. I will do so..

    Fernando Barsoba, Jun 21, 2005
  4. Snipping much of the offtopic socket stuff:
    This snprintf call writes to (the beginning of) buff a string
    You don't actually need to code an fclose() just before returning from
    main(), per below, but it is a good idea in general.
    I don't see any client (code) in your post at all, and no printf (only
    fprintf). Most likely your client is coded (as most are) to do one
    connection and then exit the program, whereas your server is coded to
    loop accepting connections forever; you must have interrupted or
    killed it somehow when done. This is an important difference: stdio
    output to a file which is not an interactive terminal, and
    "output.txt" presumably isn't, is permitted to be and normally is
    buffered, and only written when the buffer is full (which probably
    didn't happen) or you call fclose() or fflush() which you don't (you
    coded fclose() but never reach it because of the infinite loop) or the
    program exits _normally_ (by calling exit() or returning from main)
    which you don't. "Killing" with control-C or similar causes this
    buffered data to be lost.

    You could just use printf(), or fprintf (stdout, ...) which per above
    to a terminal "should" not be more than line-buffered. (However, some
    C implementations might fail to characterize as interactive some kinds
    of terminals or pseudoterminals.) And you need to "dedicate" a
    terminal to the server as long as it runs, to avoid much confusion.

    Or sprinkle fflush(fp) at various places; or after fopen()ing do
    setvbuf (fp, NULL, 0, _IONBF) which effectively does a fflush for you
    on every output operation, or _IOLBF which flushes at each end-of-line
    and change your outputs to _end_ (not begin) with \n.

    - David.Thompson1 at
    Dave Thompson, Jun 27, 2005
    1. Advertisements

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.