📄 h_tcp_clt4.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); }#ifdef TMP buf2 = (char *)malloc(size); if (buf2 == NULL) { printf("malloc is NG.\n"); exit(1); }#endifsignal(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); /* 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);#ifdef TMP /* 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); }#endif /* 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); }if (k == NUMPROC) { 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);#ifdef TMP free(buf2);#endif 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 + -