fork() works ?? Server development questions

2002-04-18 Thread ioda

Hi,

This is a re-post of my 04/06/2002 message
Many thanks to Gerrit and Phil Frisbie, Jr. for messages

But despite Gerrit seems to make it work a little better (not on local
host), it'not enough for me
Thanks to Phil for ideas but pthread are not suitable for me cause my target
project(not sample code below)
should run on systems wich were not pthread friendly !!

So big questions are still there :

Is it possible to run a server like sample code i give ?
If yes could somebody send me sample piece of code wich works ?
Is it possible to rely on fork() in cygwin ?
Is there sockets issue in the way i use it ?

I will be please, to read from Corinna Vinschen seems to be the maintainer
of portion of Cygwin, I question about

Thanks

Here start my original post

I'm in trouble porting a socket base utility from my own between mulptiple
OS.

The goal is to maintain as much as possible the same code, since this
utility
do not use advanced features (I DO NOT WANT TO CODE AN HTTP SERVER !!)

For MS plateform I hope in cygwin environment, but despite the fact it
compiles well
I do not achieve srv programm to work.

Below you will find text for four files srv.c http.c http.h and
response.html which are not the
target code, but permit to see the real problem.

This code compile under AIX whith native C compiler and other unices and run
cleanly.
This is only for test and many things were tricky, for example http HEADER
is hardcoded in the
html file !!

The problem is under cygwin environment 1.3.10 Win2k pro SP2

To test simply compile and launch srv - gcc -o srv http.c srv.c (for AIX
cc -o srv http.c srv.c)

Then launch your favorite browser and enter those url
http://IP_host_running_srv:12345/
just remplace IP_host_running_srv by proper address or hostname for you

(Hum just thinking i only test with IE !!)

You may get a page saying hello WORLD !

Just running fine for me when running srv under AIX !

Got nothing when running on Win2k, all server trace appears in console
window but nothing in browser !!

Then I quickly set up a proxy in java based on BufferedReader and
BufferedWriter classes to
see dialog between browser and srv and surprise in  this case it'works !!!

finally here are my questions

1- : Any error in the code ?
2- : If not, what's wrong cygwin, Win2k ?
3- : Is it possible to set up this type of server using cygwin under MS
windows
 (interrested in NT and W2k, forking a  child per client !) ?
4- : What is different when using proxy ?
5- : Signal handlers doesn't not work under cygwin why ?

Thanks for any help and answers !!

8=---srv.c--
#include stdio.h
#include signal.h
#include netinet/in.h
#include sys/socket.h

#include http.h

void sigchild(int sig){
  int pid;
  pid = wait(NULL);
  signal(sig, sigchild);
}

int done = 0;
void sigterm(int sig){
  fprintf(stdout, DEBUG : request to shutdown !);
  done = 1;
}

void handle_http(int sock){
  if (sendHttp(sock, response.html) == -1){
perror(sendHttp);
  }
}

int main(void) {
  int listenSock;
  int dialogSock;
  int pid;
  int flag;
  struct sockaddr_in address;
  size_t length;

  signal(SIGCHLD, sigchild);
  signal(SIGTERM, sigterm);
  signal(SIGINT, sigterm);
  signal(SIGHUP, sigterm);

  if ((listenSock = socket(AF_INET, SOCK_STREAM, 0))  0){
perror(socket);
return(1);
  }

  memset(address, 0, sizeof(struct sockaddr));
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = htonl(INADDR_ANY);
  address.sin_port = htons(12345);

  flag = 1;
  if (setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, flag, sizeof(int)) 
0){
perror(setsockopt);
return(1);
  }

  if (bind(listenSock, (struct sockaddr *) address, sizeof(address))  0){
perror(bind);
return(1);
  }

  length = sizeof(struct sockaddr_in);

  if (getsockname(listenSock, (struct sockaddr *) address, length)  0){
perror(getsockname);
return(1);
  }

  fprintf(stdout, DEBUG : Address IP = %s,, inet_ntoa(address.sin_addr));
  fprintf(stdout,  Port = %u \n, ntohs(address.sin_port));

  listen(listenSock, 5);

  while(!done){
fprintf(stdout, DEBUG : Server waiting...\n);

length = sizeof(struct sockaddr_in);

dialogSock = accept(listenSock, (struct sockaddr *) address, length);

if (dialogSock  0)
  continue;

pid = fork();

switch(pid){
  case 0 :
close(listenSock);
handle_http(dialogSock);
close(dialogSock);
fprintf(stdout, DEBUG : child done\n);
return(0);
  default :
fprintf(stdout, DEBUG : fork child %d, pid);
fprintf(stdout,  for %s:, inet_ntoa(address.sin_addr));
fprintf(stdout, %d\n, ntohs(address.sin_port));
close(dialogSock);
  break;
}
  }
  close(listenSock);
  return(0);
}

8=---http.c
#include stdio.h
#include fcntl.h
#include sys/socket.h

#include http.h

int sendHttp(int sock, char * pathToFile){
  int fd;
  

Re: Port problem

2002-04-07 Thread ioda

Hi Gerrit !
Thanks for helping

Using Browser is a way to not use client for simple tests, since my protocol
will be request/response so HTTP (in fact HTML !) is a trick ;0)

Well get back to the trouble, I confirm there is no way for me to make it
works (directly from IE), even if accessed locally (browser and server
running on the same box) or remotely (one box server, one box client).

What is your server OS and cygwin version ?

Tests you made let me think there's still something wrong (one char missing,
not work always !)

I think about possible problem is dup of socket descriptor not cleanly made
when forking.
Not clear for me but it's like socket was closed before all data were sent.

An other question howto debug child process using gdb ?

Thanks !

(PS sorry for poor english !)










--
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ:   http://cygwin.com/faq/




Port problem

2002-04-06 Thread ioda

Hi,

I'm in trouble porting a socket base utility from my own between mulptiple
OS.

The goal is to maintain as much as possible the same code, since this
utility
do not use advanced features (I DO NOT WANT TO CODE AN HTTP SERVER !!)

For MS plateform I hope in cygwin environment, but despite the fact it
compiles well
I do not achieve srv programm to work.

Below you will find text for four files srv.c http.c http.h and
response.html which are not the
target code, but permit to see the real problem.

This code compile under AIX whith native C compiler and other unices and run
cleanly.
This is only for test and many things were tricky, for example http HEADER
is hardcoded in the
html file !!

The problem is under cygwin environment 1.3.10 Win2k pro SP2

To test simply compile and launch srv - gcc -o srv http.c srv.c (for AIX
cc -o srv http.c srv.c)

Then launch your favorite browser and enter those url
http://IP_host_running_srv:12345/
just remplace IP_host_running_srv by proper address or hostname for you

(Hum just thinking i only test with IE !!)

You may get a page saying hello WORLD !

Just running fine for me when running srv under AIX !

Got nothing when running on Win2k, all server trace appears in console
window but nothing in browser !!

Then I quickly set up a proxy in java based on BufferedReader and
BufferedWriter classes to
see dialog between browser and srv and surprise in  this case it'works !!!

finally here are my questions

1- : Any error in the code ?
2- : If not, what's wrong cygwin, Win2k ?
3- : Is it possible to set up this type of server using cygwin under MS
windows
 (interrested in NT and W2k, forking a  child per client !) ?
4- : What is different when using proxy ?
5- : Signal handlers doesn't not work under cygwin why ?

Thanks for any help and answers !!

8=---srv.c--
#include stdio.h
#include signal.h
#include netinet/in.h
#include sys/socket.h

#include http.h

void sigchild(int sig){
  int pid;
  pid = wait(NULL);
  signal(sig, sigchild);
}

int done = 0;
void sigterm(int sig){
  fprintf(stdout, DEBUG : request to shutdown !);
  done = 1;
}

void handle_http(int sock){
  if (sendHttp(sock, response.html) == -1){
perror(sendHttp);
  }
}

int main(void) {
  int listenSock;
  int dialogSock;
  int pid;
  int flag;
  struct sockaddr_in address;
  size_t length;

  signal(SIGCHLD, sigchild);
  signal(SIGTERM, sigterm);
  signal(SIGINT, sigterm);
  signal(SIGHUP, sigterm);

  if ((listenSock = socket(AF_INET, SOCK_STREAM, 0))  0){
perror(socket);
return(1);
  }

  memset(address, 0, sizeof(struct sockaddr));
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = htonl(INADDR_ANY);
  address.sin_port = htons(12345);

  flag = 1;
  if (setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, flag, sizeof(int)) 
0){
perror(setsockopt);
return(1);
  }

  if (bind(listenSock, (struct sockaddr *) address, sizeof(address))  0){
perror(bind);
return(1);
  }

  length = sizeof(struct sockaddr_in);

  if (getsockname(listenSock, (struct sockaddr *) address, length)  0){
perror(getsockname);
return(1);
  }

  fprintf(stdout, DEBUG : Address IP = %s,, inet_ntoa(address.sin_addr));
  fprintf(stdout,  Port = %u \n, ntohs(address.sin_port));

  listen(listenSock, 5);

  while(!done){
fprintf(stdout, DEBUG : Server waiting...\n);

length = sizeof(struct sockaddr_in);

dialogSock = accept(listenSock, (struct sockaddr *) address, length);

if (dialogSock  0)
  continue;

pid = fork();

switch(pid){
  case 0 :
close(listenSock);
handle_http(dialogSock);
close(dialogSock);
fprintf(stdout, DEBUG : child done\n);
return(0);
  default :
fprintf(stdout, DEBUG : fork child %d, pid);
fprintf(stdout,  for %s:, inet_ntoa(address.sin_addr));
fprintf(stdout, %d\n, ntohs(address.sin_port));
close(dialogSock);
  break;
}
  }
  close(listenSock);
  return(0);
}

8=---http.c
#include stdio.h
#include fcntl.h
#include sys/socket.h

#include http.h

int sendHttp(int sock, char * pathToFile){
  int fd;
  char c;
  int rc;

  fd=open(pathToFile, O_RDONLY, 0);
  if (fd == -1){
perror(http.c open);
return -1;
  }

  while((rc = read(fd, c, 1))  0){
if ((rc = write(sock, c, 1)) == -1) {
  perror(http.c write);
}else{
  write(fileno(stdout), c, 1);
}
  }

  close(fd);
  fprintf(stdout, DEBUG : file forwarded !\n);
  return 0;
}
8=---http.h
#ifndef _HTTP_H
#define _HTTP_H
int sendHttp(int sock, char * pathToFile);
#endif
8=---response.html-
HTTP/1.0 200 OK
DATE : Fri, 05 Apr 2002 11:22:12 DFT
Server : DummyWS/0.1
Content-Type : text/HTML
Content-Length : 112
Last-Modified : Thu, 21 Mar 2002 00:11:12 NFT

html
head
titleTest