Mail Archives: cygwin/2005/09/16/15:56:18
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/
- Raw text -