Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Socket programming problem: can't generate output in server socket

Reply
Thread Tools

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

 
 
ferbar
Guest
Posts: n/a
 
      06-21-2005
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;
strcpy(file,"output.txt");

if ((fp = fopen(file, "w")) == NULL)
{
printf("Can't open %s\n", file);
exit(1);
}
else
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
converted
// 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");
else
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));
close(connfd);
}
// exit(0);

// ********************
fclose(fp);
// ********************
}


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?

Thanks!

Fernando

 
Reply With Quote
 
 
 
 
Jack Klein
Guest
Posts: n/a
 
      06-21-2005
On 20 Jun 2005 20:13:23 -0700, "ferbar" <(E-Mail Removed)> wrote
in comp.lang.c:

> 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>


Not a standard C header.

> #include <sys/socket.h>


Not a standard C header.

> #include <sys/types.h>


Not a standard C header.

> #include <string.h>
> #include <stdio.h>
> #include <unistd.h>


Not a standard C header.

[snip]

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 news:comp.unix.programmer,
but it is highly recommended that you read their socket FAQ before
asking networking questions.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
 
Reply With Quote
 
 
 
 
Fernando Barsoba
Guest
Posts: n/a
 
      06-21-2005
Jack Klein wrote:
> On 20 Jun 2005 20:13:23 -0700, "ferbar" <(E-Mail Removed)> wrote
> in comp.lang.c:
>
>
>>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>

>
>
> Not a standard C header.
>
>
>>#include <sys/socket.h>

>
>
> Not a standard C header.
>
>
>>#include <sys/types.h>

>
>
> Not a standard C header.
>
>
>>#include <string.h>
>>#include <stdio.h>
>>#include <unistd.h>

>
>
> Not a standard C header.
>
> [snip]
>
> 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 news:comp.unix.programmer,
> but it is highly recommended that you read their socket FAQ before
> asking networking questions.
>

Thanks for the reference. I will do so..

Fernando
 
Reply With Quote
 
Dave Thompson
Guest
Posts: n/a
 
      06-27-2005
On 20 Jun 2005 20:13:23 -0700, "ferbar" <(E-Mail Removed)> wrote:

> 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.


Snipping much of the offtopic socket stuff:

> char file[32];
> FILE *fp;
> strcpy(file,"output.txt");
>
> if ((fp = fopen(file, "w")) == NULL)
> {
> printf("Can't open %s\n", file);
> exit(1);
> }
> else
> fprintf(fp, "\nFirst step...");

<snip>
> 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");
> else
> 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));


This snprintf call writes to (the beginning of) buff a string
consisting of a single percent sign, so that's what your <offtopic>
write() sends. If that's not what you wanted, that's your error.

> close(connfd);
> }
> // exit(0);
>
> // ********************
> fclose(fp);
> // ********************
> }


You don't actually need to code an fclose() just before returning from
main(), per below, but it is a good idea in general.

>
>
> 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?
>

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 worldnet.att.net
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Failed to generate a user instance of SQL Server. Only an integratedconnection can generate a user instance. Harlan Messinger ASP .Net 2 03-28-2010 06:51 PM
Re: socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Steve Holden Python 0 02-01-2009 12:45 PM
Re: socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Laszlo Nagy Python 0 02-01-2009 07:37 AM
socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Laszlo Nagy Python 1 01-27-2009 05:05 PM
Re: socket.unbind or socket.unlisten? - socket.error: (48,'Address already in use') Jean-Paul Calderone Python 0 01-27-2009 01:41 PM



Advertisments