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

📄 h_tcp_clt6.c

📁 T-kernel Tcp/ip Protocol Stack Sample
💻 C
字号:
/* *  Copyright (C) 1999-2006 MITSUBISHI ELECTRIC CORPORATION and *  RENESAS SOLUTIONS CORPORATION and *  RENESAS TECHNOLOGY CORPORATION *  All rights reserved. * */#include <stdio.h>#include <signal.h>#include <ctype.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <netdb.h>#include <sys/wait.h>#include "config.h"extern int errno;int sd, newsd;void sig_hdr(){	/* printf("received SIGINT.\n"); */	shutdown(sd, SHUT_RDWR);	close(sd);	sleep(2);	exit(0);}#define SIZE (16*1024)#define NUMPROC 3/* * TCP client program */main(argc, argv)int	argc;char **argv;{	int i, j, k, len;	char ch, *buf, *buf2;	struct sockaddr_in	sinme, sindst;	int size, total, addrlen;	int pid[NUMPROC +1];#ifdef SUNOS	union wait status;#else	int status;#endif		size = SIZE;	ch = 'a';for (k=1; k <= NUMPROC; k++) {pid[k] = fork();if (pid[k] < 0) {	printf("(%d)fork is NG.(errno=%d)\n", k, errno);	break;}else if (pid[k] > 0) {	continue;}	/* I'm child */	errno = 0;	buf = (char *)malloc(size);	if (buf == NULL) {		printf("malloc is NG.\n");		exit(1);	}	buf2 = (char *)malloc(size);	if (buf2 == NULL) {		printf("malloc is NG.\n");		exit(1);	}signal(SIGINT, sig_hdr);	memset((char *)&sindst, 0, sizeof(struct sockaddr_in));	sindst.sin_family = AF_INET;	sindst.sin_addr.s_addr = inet_addr(DST_ADDR);	sindst.sin_port = htons(PORT_NUM + (k-1));	/* set data contents */	memset(buf, ch, size);	for (j=1; j <= LOOP; j++) {		/* create an endpoint for TCP communication */		errno = 0;		if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {			printf("(%d-%d)socket is NG.(errno=%d)\n", k, j, errno);			break;		}		printf("(%d-%d)socket is OK.\n", k, j);			/* initiate a connection on the socket */		if (connect(sd, (struct sockaddr *)&sindst, sizeof(sindst)) < 0) {			printf("(%d-%d)connect is NG.(errno=%d)\n", k, j, errno);			close(sd);			break;		}		printf("(%d-%d)connect is OK.\n", k, j);			/* send data */		if ((len = send(sd, buf, size, 0)) < 0) {			printf("(%d-%d)sending TCP data is NG.(errno=%d)\n", k, j, errno);			close(sd);			break;		}		printf("(%d-%d)sending TCP data is OK.(size=%d)\n", k, j, len);		/* clear data contents */		memset(buf2, 0, size);		/* receive data */		total = 0;		while (total < size) {			if ((len = recv(sd, buf2, size, 0)) < 0) {				printf("(%d-%d)receiving TCP data is NG.(errno=%d)\n", k, j, errno);				close(sd);				break;			}			total += len;			/* check data contesnts */			for (i=0; i < len; i++) {				if (buf2[i] != ch) {					break;				}			}			if (i < len) {				printf("(%d-%d)checking TCP data contents is NG.\n", k, j);				close(sd);				goto err;			}		}		if (total != size) {			printf("(%d-%d)receiving TCP data is NG.(total size=%d)\n", k, j, total);			close(sd);			break;		}		else {			printf("(%d-%d)receiving TCP data is OK.(total size=%d)\n", k, j, total);		}		/* shut down sending data */		if (shutdown(sd, SHUT_RDWR) < 0) {			printf("(%d-%d)shutdown is NG.(errno=%d)\n", k, j, errno);			close(sd);			break;		}		printf("(%d-%d)shutdown is OK.\n", k, j);		if (close(sd) < 0) {			printf("(%d-%d)close is NG.(errno=%d)\n", k, j, errno);			break;		}		printf("(%d-%d)close is OK.\n\n", k, j);		/* sleep 1 second */		sleep(1);	}	errno = 0;	if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {		printf("(%d-%d)socket is NG.(errno=%d)\n", k, j, errno);		goto err;	}	printf("(%d-%d)socket is OK.\n", k, j);		if (connect(sd, (struct sockaddr *)&sindst, sizeof(sindst)) < 0) {		printf("(%d-%d)connect is NG.(errno=%d)\n", k, j, errno);		close(sd);		goto err;	}	printf("(%d-%d)connect is OK.\n", k, j);		if ((len = send(sd, buf, 0, 0)) < 0) {		printf("(%d-%d)sending TCP data is NG.(errno=%d)\n", k, j, errno);		close(sd);		goto err;	}	printf("(%d-%d)sending TCP data is OK.(size=%d)\n", k, j, len);	if (shutdown(sd, SHUT_RDWR) < 0) {		printf("(%d-%d)shutdown is NG.(errno=%d)\n", k, j, errno);		close(sd);		goto err;	}	printf("(%d-%d)shutdown is OK.\n", k, j);	if (close(sd) < 0) {		printf("(%d-%d)close is NG.(errno=%d)\n", k, j, errno);	}	printf("(%d-%d)close is OK.\n\n", k, j);err:	free(buf);	free(buf2);	printf("Pass child(%d).\n", k);	sleep(2);	exit(0);}	/* I'm parent */	for (k=1; k <= NUMPROC; k++) {		wait(&status);	}	printf("Pass parent.\n");	return (0);}/* EOF */

⌨️ 快捷键说明

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