This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

socket troubles


Hello,

Sorry, I've not been very accurate in my last post so, this time, I'll
post the test client/server

I try to make a little client/server tcp.

server side
------------
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <setjmp.h>
#ifdef SUN
  #include <signal.h>
#else
  #include <sys/signal.h>
#endif
#include <sys/wait.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define SA    struct sockaddr
#define SA_IN struct sockaddr_in



/*
*/
static int init_nw(char *address, int port, SA_IN *servaddr)
{
  struct hostent *inf;
  int f_on=1;
  int s;
  
  s = socket(AF_INET, SOCK_STREAM, 0);

  if (s<0)       
    return 0;

  setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &f_on, sizeof(int));
  setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *) &f_on, sizeof(int));

  memset(servaddr, 0, sizeof(SA_IN));
  servaddr->sin_family = AF_INET;
  servaddr->sin_port = htons((unsigned short)port);

  if (address==NULL || strlen(address)==0)
    servaddr->sin_addr.s_addr = htonl(INADDR_ANY);
  else
    servaddr->sin_addr.s_addr = inet_addr(address); 

  if (servaddr->sin_addr.s_addr==INADDR_NONE)
  {
    inf = gethostbyname(address);

    if (inf==NULL)
      return 0;

    memcpy( &servaddr->sin_addr.s_addr, inf->h_addr, inf->h_length );
  }

  return s;
}






/*
*
*/
int main(int argc, char *argv[]) 
{
  int sock, sd, r;
  SA_IN servaddr;
  int rf, f=0;
  char ok[2048];

  sd = init_nw("", 5600, &servaddr);

  if (sd<=0)
  {
    exit(500);
  }

  // blocking
  r = fcntl(sd, F_SETFL, f & (~O_NONBLOCK) );
 
  if (r<0)
  {
    exit(500);
  }


  if ( bind(sd, (SA *) &servaddr, sizeof(servaddr))==-1 )
  {
    exit(501);
  }


  r = listen( sd, 5);

  
  while(1)
  {
    errno=0;

    sock = accept(sd, NULL,NULL);
    
    if (errno==0)
    {
      rf = fork();

      /* father will still listener forever */
      if (!rf)
      {
          fcntl(sock, F_SETFL, f & (~O_NONBLOCK) );
  
          shutdown(sd, SHUT_RDWR);
          recv(sock, ok, 2048, 0);
          
          sprintf(ok, "01101996 123 444");
          send(sock, ok, strlen(ok)+1, 0);
          
          /* no return from client just to "block" the child */
          recv(sock, ok, 2048, 0);
          
          shutdown(sock, SHUT_RDWR);

          break;
      }
    }
    else
    {
      printf("errno = %d", errno);
    }
  }



  shutdown(sd, SHUT_RDWR);
  
  return 0;
}





Ok now, the test side with a simple VC++ 6 program
--------------------------------------------------

#include <windows.h>
#include "stdafx.h"
#include <winsock.h>
#include <sys/types.h>
#include <unistd.h>

#pragma comment(lib, "wsock32.lib")


#define SA    struct sockaddr
#define SA_IN struct sockaddr_in


/**
*/
int net_create(char *address, int port, SA_IN *servaddr)
{
  struct hostent *inf;
  int f_on=1;
  int s, r;
  
  s = socket(AF_INET, SOCK_STREAM, 0);

  if(s<0)       
    return 0;

  r = setsockopt( s, SOL_SOCKET, SO_REUSEADDR, (const char *) &f_on,
sizeof(int) );
  r = setsockopt( s, SOL_SOCKET, SO_KEEPALIVE, (const char *) &f_on,
sizeof(int) );

  memset(servaddr, 0, sizeof(SA_IN));
  servaddr->sin_family = AF_INET;
  servaddr->sin_port = htons((unsigned short)port);


  if (address==NULL || strlen(address)==0)
    servaddr->sin_addr.s_addr = htonl(INADDR_ANY);
  else
    servaddr->sin_addr.s_addr = inet_addr(address); 


  if (servaddr->sin_addr.s_addr==INADDR_NONE)
  {
    inf = gethostbyname(address);

	/* impossible de trouver la dotted, marre... */
	if(inf==NULL)
      return 0;

	  memcpy( &servaddr->sin_addr.s_addr, inf->h_addr, inf->h_length );
  }

  return s;
}





/*
*
*/
void test( )
{
  int sck;
  SA_IN sa;
  char m[2048];

  
  sck = net_create("127.0.0.1", 5600, &sa);

  if (sck<=0)
    puts("err");
  else
  {
    //r = setsockopt(sck, SOL_SOCKET, SO_SNDBUF, (char *) &si, sizeof(int));
    //r = getsockopt(sck, SOL_SOCKET, SO_SNDBUF, (char *) &si, &ln);
    //setsockopt(sck, SOL_SOCKET, SO_RCVBUF, (char *) &si, sizeof(int));

    if ( connect(sck, (SA *) &sa, sizeof(sa))==-1 )
      closesocket(sck);
    else
    {
      sprintf(m, "19041967|xx|xx|xx|ok|xx"); 

      send(sck, m, strlen(m)+1, 0);

      recv(sck, m, 2048, 0);
    }
  }


}




//--------------------------------
//
void main()
{
  int r;
  WORD wVersionRequested;
  WSADATA wsadata;
  
  wVersionRequested = MAKEWORD(2,0);
  WSAStartup(wVersionRequested,&wsadata );

  
  for (r=0; r<160; r++)
  {
    test();
    printf(">>>%d\n", r);
  }


  return;
}



Now, my problem :
When I run my program test for the first time, everything is ok...

But after 2 or 3 times... the server side doesn't respond anymore !!?

Where is/are my error(s) ?



ps : Just a remark
I've not managed the zombies process with sigchild(), but I cannot see
one of them
with `ps -ef' 

why ?



Thanks you for your answers

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]