⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pingpong.c

📁 ftam等标准协议服务器和客户端的源代码。
💻 C
字号:
/* pingpong.c - listen and call out at the same time */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/pingpong/RCS/pingpong.c,v 9.0 1992/06/16 12:43:14 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/others/pingpong/RCS/pingpong.c,v 9.0 1992/06/16 12:43:14 isode Rel $ * * * $Log: pingpong.c,v $ * Revision 9.0  1992/06/16  12:43:14  isode * Release 8.0 * *//* *				  NOTICE * *    Acquisition, use, and distribution of this module and related *    materials are subject to the restrictions of a license agreement. *    Consult the Preface in the User's Manual for the full terms of *    this agreement. * */#include <stdio.h>#include "isoaddrs.h"#include "tsap.h"struct PSAPaddr * pingaddr;struct PSAPaddr * pongaddr;int cn_state = NOTOK;int cn_sd = NOTOK;fd_set	wfds, rfds;int	nfds = 0;int	doneit = 0;int	retry = 1;main (argc,argv)int argc;char ** argv;{	do_args (argc,argv);	start_listener ();	(void) printf ("Started to listen\n");	ping_address ();	wait_for_result ();	(void) printf ("Got Result\n");	stop_nicely ();	return 0;}do_args (argc,argv)int argc;char ** argv;{	char * myname;	if (myname = rindex (argv[0], '/'))		myname++;	if (myname == NULL || *myname == NULL)		myname = argv[0];	if (argc != 3) {		(void) fprintf (stderr,"Usage pingpong listen_address call_address\n");		exit (-1);	}	isodetailor (myname, 0);	if ((pongaddr = str2paddr (argv[1])) == NULLPA) {		(void) fprintf (stderr,"Invalid listen address %s\n", argv[1]);		exit (-1);	}	if ((pingaddr = str2paddr (argv[2])) == NULLPA) {		(void) fprintf (stderr,"Invalid call address %s\n", argv[2]);		exit (-1);	}}start_listener (){	struct TSAPdisconnect	  td_s;	struct TSAPdisconnect	* td = &(td_s);	if(TNetListen(&pongaddr->pa_addr.sa_addr, td) == NOTOK) {		ts_advise ("TNetListen", td);		exit (-2);	}}ping_address (){	struct TSAPstart tss;	register struct TSAPstart *ts = &tss;	struct TSAPdisconnect   tds;	register struct TSAPdisconnect  *td = &tds;	struct TSAPconnect tcs;	struct TSAPconnect *tc = &tcs;	cn_state = TAsynConnRequest (NULLTA, &pingaddr->pa_addr.sa_addr, 0,				     NULLCP, ts -> ts_cc, &ts -> ts_qos,				     tc, td, 1);	cn_sd = tc -> tc_sd;	(void) printf ("Starting ping on %d state ", cn_sd);	updatemask ();	if (cn_state == NOTOK)		ts_advise ("TAsynConnRequest", td);	else		retry = 0;}wait_for_result (){	int	vecp = 0;	char    *vec[4];	int	i;	struct TSAPdisconnect	td_s;	struct TSAPdisconnect	*td = &td_s;	struct TSAPconnect tcs;	struct TSAPconnect *tc = &tcs;	struct TSAPstart tss;	struct TSAPstart *ts = &tss;	fd_set ifds, ofds;	for (;;) {		ifds = rfds;		ofds = wfds;		(void) printf ("TNetAccept nfds=%d rfds=0x%x wfds=0x%x\n", nfds,			rfds.fds_bits[0], wfds.fds_bits[0]);		if(TNetAccept(&vecp, vec, nfds, &ifds, &ofds, NULLFD,			      NOTOK, td) == NOTOK)		{			ts_advise ("TNetAccept failed", td);			exit (-3);		}		if (retry)			ping_address ();		if (vecp > 0) {			if (TInit (vecp, vec, ts, td) == NOTOK) {				ts_advise ("TInit failed failed", td);				exit (-1);			}			if (TConnResponse (ts->ts_sd, NULLTA, 0, NULLCP, 0,					   &tc -> tc_qos, td) == NOTOK) {				ts_advise ("TConnResponse", td);				exit (-1);			}			(void) printf ("Connection accepted on %d\n", ts -> ts_sd);			FD_SET (ts -> ts_sd, &rfds);			if (ts -> ts_sd >= nfds)				nfds = ts -> ts_sd + 1;		}		for (i = 0; i < nfds; i++) {			if (FD_ISSET (i, &ofds) || FD_ISSET (i, &ifds)) {				if (i == cn_sd)					progress_connection ();				else {					if (sink_data (i) != OK) {						FD_CLR (i, &rfds);						if (doneit ++ > 0)							return;					}									}			}		}		if (cn_state == DONE) {			if (doneit ++ > 0)				return;			cn_state = NOTOK;		}	}}sink_data (sd)int	sd;{	struct TSAPdisconnect tds;	struct TSAPdisconnect *td = &tds;	struct TSAPdata txs, *tx = &txs;		if (TReadRequest (sd, tx, OK, td) == NOTOK) {		if (td -> td_reason = DR_NORMAL)			ts_advise ("Normal disconnection", td);		else	ts_advise ("TReadRequest", td);		return NOTOK;	}	TXFREE (tx);	return OK;}progress_connection (){				struct TSAPdisconnect	td_s;	struct TSAPdisconnect	*td = &td_s;	struct TSAPconnect tcs;	struct TSAPconnect *tc = &tcs;	switch(cn_state)	{	    case CONNECTING_1:		(void) printf ("CONNECTING_1 -> ");		cn_state = TAsynRetryRequest(cn_sd,tc,td);		if (cn_state == NOTOK)			ts_advise ("\nTAsynRetryRequest", td);		updatemask ();		break;	    case CONNECTING_2:		(void) printf ("CONNECTING_2 -> ");		cn_state = TAsynRetryRequest(cn_sd,tc,td);		if (cn_state == NOTOK)			ts_advise ("\nTAsynRetryRequest", td);		updatemask();		break;	    case NOTOK:		(void) printf ("NOTOK\n");		updatemask ();		break;	    case DONE:		(void) printf ("DONE->");		updatemask ();		break;	    default:		(void) printf ("cn_state weird\n");		exit (-4);	}}stop_nicely (){	struct TSAPdisconnect	  td_s;	struct TSAPdisconnect	* td = &(td_s);	(void) TNetClose (&pongaddr->pa_addr.sa_addr, td);}updatemask (){	struct TSAPdisconnect	  td_s;	struct TSAPdisconnect	* td = &(td_s);	if (cn_sd != NOTOK) {		FD_CLR (cn_sd, &rfds);		FD_CLR (cn_sd, &wfds);		if (cn_sd >= nfds)			nfds = cn_sd + 1;	}	switch (cn_state) {	    case NOTOK:		(void) printf ("NOTOK\n");		break;	    default:		(void) printf ("weird!\n");		break;	    case CONNECTING_1:		(void) printf ("CONNECTING_1\n");		FD_SET (cn_sd, &wfds);		break;	    case CONNECTING_2:		(void) printf ("CONNECTING_2\n");		FD_SET (cn_sd, &rfds);		break;	    case DONE:		(void) printf ("DONE\n");		(void) TDiscRequest (cn_sd, NULLCP, 0, td);		cn_sd = NOTOK;		(void) printf ("Disconnect sent\n");		break;	}}ts_advise (str, td)char	*str;struct TSAPdisconnect *td;{	if (td -> td_cc > 0)		(void) printf ("%s : %s [%*.*s]\n", str, TErrString (td -> td_reason),			td -> td_cc, td -> td_cc, td -> td_data);	else	(void) printf ("%s : %s\n", str, TErrString (td -> td_reason));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -