TCP回射程序

来源:互联网 发布:delete mysql 编辑:程序博客网 时间:2024/04/28 11:00

服务器端的代码如下:

/*************************************************************************> File Name: tcpserv.c> Author: mhsheng> Mail:981065720@qq.com > Created Time: Wed 09 Nov 2016 09:59:55 AM CST ************************************************************************/// c standard head file#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>// system i/o head file#include <unistd.h>// socket head file#include <netinet/in.h>#define MAXLINE1024#define LISTENQ5#define SERV_PORT9066voiderr_quit(const char *str_err){fprintf(stderr, "%s\n", str_err);exit(-1);}voiderr_sys(const char *str_err){fprintf(stderr, "%s\n", str_err);exit(-1);}intSocket(int faimly, int type, int protocol){int sockfd;if ( (sockfd = socket(faimly, type, protocol)) < 0)err_sys("socket error");return sockfd;}void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen){if (bind(sockfd, myaddr, addrlen) < 0)err_sys("bind error");}void Listen(int sockfd, int backlog){if (listen(sockfd, backlog) < 0)err_sys("listen error");}intAccept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen){int connfd;connfd = accept(sockfd, cliaddr, addrlen);if (connfd < 0)err_sys("accept error");return connfd;}voidClose(int sockfd){if (close(sockfd) < 0)err_sys("close error");}//////////////////////////////////////////////////////////////////////////// Writen Begin //ssize_twriten(int fd, const void *vptr, size_t n){size_tnleft;ssize_tnwritten;const char*ptr;ptr= vptr;nleft= n;while (nleft > 0) {if ( (nwritten = write(fd, ptr, nleft)) <= 0) {if (nwritten < 0 && errno == EINTR)nwritten = 0;/* and call write() again */elsereturn (-1);}nleft-= nwritten;ptr+= nwritten;}return (n);}voidWriten(int fd, void *ptr, size_t nbytes){if (writen(fd, ptr, nbytes) != nbytes)err_sys("writen error");}// // Writen end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidstr_echo(int sockfd){charbuf[MAXLINE];ssize_tn;for ( ; ; ) {// 从套接字读取数据while ( (n = read(sockfd, buf, MAXLINE)) > 0)// 将读取的数据发送给客户端Writen(sockfd, buf, n);if (n < 0 && errno == EINTR)continue;else if (n < 0)err_sys("str_echo: read error");elsebreak;}}intmain(int argc, char **argv){intlistenfd;intconnfd;intpid;struct sockaddr_inservaddr;// 申请一个套接字描述符号listenfd = Socket(AF_INET, SOCK_STREAM, 0);// 设置监听套接字的memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family= AF_INET;servaddr.sin_port= htons(SERV_PORT);servaddr.sin_addr.s_addr= htonl(INADDR_ANY);// 绑定套接字Bind(listenfd, (struct sockaddr *) & servaddr, sizeof(servaddr));// 启动监听套接字Listen(listenfd, LISTENQ);for ( ; ; ) {// 得到一个连接套接字connfd = Accept(listenfd, NULL, NULL);// 启动一个新的进程if ( (pid = fork()) == 0) // fork函数有这个特性{Close(listenfd);  // 需要在子进程中关闭 监听套接字str_echo(connfd);Close(connfd);exit(0);}Close(connfd);}exit(0);}

客户端的程序如下:

/*************************************************************************> File Name: tcpcli.c> Author: mhsheng> Mail:981065720@qq.com > Created Time: Wed 09 Nov 2016 10:55:40 AM CST ************************************************************************/// c standard head file#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>// system i/o head file#include <unistd.h>// socket head file#include <netinet/in.h>#define MAXLINE1024#define LISTENQ5#define SERV_PORT9066voiderr_quit(const char *str_err){fprintf(stderr, "%s\n", str_err);exit(-1);}voiderr_sys(const char *str_err){fprintf(stderr, "%s\n", str_err);exit(-1);}intSocket(int faimly, int type, int protocol){int sockfd;if ( (sockfd = socket(faimly, type, protocol)) < 0)err_sys("socket error");return sockfd;}voidConnect(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen){if (connect(sockfd, myaddr, addrlen) < 0)err_sys("connect error");}void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen){if (bind(sockfd, myaddr, addrlen) < 0)err_sys("bind error");}void Listen(int sockfd, int backlog){if (listen(sockfd, backlog) < 0)err_sys("listen error");}intAccept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen){int connfd;connfd = accept(sockfd, cliaddr, addrlen);if (connfd < 0)err_sys("accept error");return connfd;}voidClose(int sockfd){if (close(sockfd) < 0)err_sys("close error");}//////////////////////////////////////////////////////////////////////////// Writen begin //ssize_twriten(int fd, const void *vptr, size_t n){size_tnleft;ssize_tnwritten;const char*ptr;ptr= vptr;nleft= n;while (nleft > 0) {if ( (nwritten = write(fd, ptr, nleft)) <= 0) {if (nwritten < 0 && errno == EINTR)nwritten = 0;/* and call write() again */elsereturn (-1);}nleft-= nwritten;ptr+= nwritten;}return (n);}voidWriten(int fd, void *ptr, size_t nbytes){if (writen(fd, ptr, nbytes) != nbytes)err_sys("writen error");}// // Writen end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Readline begin//static intread_cnt;static char*read_ptr;static charread_buf[MAXLINE];staticssize_tmy_read(int fd, char *ptr){if (read_cnt <= 0) {for ( ; ; ) {if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {if (errno == EINTR) continue;return -1;} else if (read_cnt == 0)return 0;read_ptr = read_buf;break;}}read_cnt--;*ptr = *read_ptr++;return 1;}ssize_treadline(int fd, void *vptr, size_t maxlen){ssize_tn;ssize_trc;charc;char*ptr;ptr = vptr;for (n=1; n<maxlen; n++) {if ( (rc = my_read(fd, &c)) == 1) {*ptr++ = c;if (c == '\n')break;} else if (rc == 0) {*ptr = 0;/* EOF, n - 1 bytes were read */return n-1;} else {return -1;}}*ptr = 0;return n;}ssize_tReadline(int fd, void *ptr, size_t maxlen){ssize_tn;if ( (n = readline(fd, ptr, maxlen)) < 0)err_sys("readline error");return n;}//// Readline end////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// wrapstdio begin// // Fgets beginchar *Fgets(char *ptr, int n, FILE *stream){char *rptr;if ( (rptr = fgets(ptr, n, stream)) == NULL && ferror(stream))err_sys("fgets error");return rptr;}// Fgets end// Fputs beginvoidFputs(const char *ptr, FILE *stream){if (fputs(ptr, stream) == EOF)err_sys("fputs error");}// Fputs end// // wrapstdio end////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// str_echo begin//voidstr_echo(int sockfd){charbuf[MAXLINE];ssize_tn;for ( ; ; ) {// 从套接字读取数据while ( (n = read(sockfd, buf, MAXLINE)) > 0)// 将读取的数据发送给客户端Writen(sockfd, buf, n);if (n < 0 && errno == EINTR)continue;else if (n < 0)err_sys("str_echo: read error");elsebreak;}}//// str_echo end////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// str_cli begin//voidstr_cli(FILE *fp, int sockfd){charsendline[MAXLINE];charrecvline[MAXLINE];while (Fgets(sendline, MAXLINE, fp) != NULL) {Writen(sockfd, sendline, strlen(sendline));if (Readline(sockfd, recvline, MAXLINE) == 0)err_quit("str_cli: server terminated prematurely");Fputs(recvline, stdout);}}//// str_cli end//////////////////////////////////////////////////////////////////////////intmain(int argc, char **argv){intsockfd;struct sockaddr_inservaddr;if (argc != 2)err_quit("usage: tcpcli <IPaddress>");// 申请一个套接字sockfd = Socket(AF_INET, SOCK_STREAM, 0);// 设置一个服务器套接字memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family= AF_INET;servaddr.sin_port= htons(SERV_PORT);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);Connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));str_cli(stdin, sockfd);exit(0);}

Makefile文件如下:

PROGS= tcpserv \  tcpcliOBJS= tcpserv.o \  tcpcli.oAll:${PROGS}tcpserv:tcpserv.occ -o tcpserv tcpserv.otcpcli:tcpcli.occ -o tcpcli tcpcli.oclean:rm $(PROGS) $(OBJS)


0 0
原创粉丝点击