Subject: Port problem
From: "ioda" <[email-masked]>
To: [email-masked]
Date: Sat, 6 Apr 2002 20:59:06 +0200
Newsgroups: gmane.os.cygwin

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>
<title>Test page</title>
</head>
<body>
<center>
<h1>Hello WORLD !</h1>
</center>
</body>
</html>
8=<-----------------------------------------------------------------

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