Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Message-ID: <4a03a72c050916125687025c1@mail.gmail.com> Date: Fri, 16 Sep 2005 21:56:01 +0200 From: znort Reply-To: znort AT delorie DOT com To: cygwin AT cygwin DOT com Subject: socket troubles Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Disposition: inline X-IsSubscribed: yes Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id j8GJuDoA010676 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 #include #include #include #include #ifdef SUN #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #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 #include "stdafx.h" #include #include #include #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/