/* wrapper.c */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> void perr_exit(const char * s) { perror(s); exit(1); } int Socket(int domain, int type, int protocol) { int sockfd; sockfd = socket(domain, type, protocol); if (sockfd == -1) { perr_exit("socket error"); } return sockfd; } void Connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int n; n = connect(sockfd, addr, addrlen); if (n == -1) { perr_exit("connect error"); } } void Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int n; n = bind(sockfd, addr, addrlen); if (n == -1) { perr_exit("bind error"); } } void Listen(int sockfd, int backlog) { int n; n = listen(sockfd, backlog); if (n == -1) { perr_exit("listen error"); } } int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { int connfd; connfd = accept(sockfd, addr, addrlen); if (connfd == -1) { perr_exit("accept error"); } return connfd; } ssize_t Write(int fd, const void *buf, size_t count) { ssize_t n; n = write(fd, buf, count); if (n == -1) { perr_exit("write error"); } return n; } ssize_t Read(int fd, void * buf, size_t count) { ssize_t n; n = read(fd, buf, count); if (n == -1) { perr_exit("read error"); } return n; } void Close(int fd) { int n; n = close(fd); if (n == -1) { perr_exit("close error"); } }
// TCP服务器端 // server.c #include "wrapper.c" #include <string.h> #include <time.h> #include <arpa/inet.h> #define LISTENQ 128 int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr, clieaddr; socklen_t clieaddr_len; char buff[BUFSIZ]; time_t ticks; // 创建socket listenfd = Socket(AF_INET, SOCK_STREAM, 0); // 绑定 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);// INADDR_ANY表示本地的任意IP地址 servaddr.sin_port = htons(13); Bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr)); // 设置listenfd处于监听状态 Listen(listenfd, LISTENQ); printf("wait for client connect ...\n"); // 服务器调用accept()接受连接 while (1) { clieaddr_len = sizeof(clieaddr); connfd = Accept(listenfd, (struct sockaddr *)&clieaddr, &clieaddr_len); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); Write(connfd, buff, strlen(buff)); Close(connfd); } return 0; }
// TCP客户端 // client.c #include "wrapper.c" #include <arpa/inet.h> #include <string.h> int main(int argc, char **argv) { int sockfd, n; char recvline[BUFSIZ]; struct sockaddr_in servaddr; if (argc != 2) { perr_exit("usage: client <IPaddress>"); } sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { perr_exit("inet_pton error"); } Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); while (1) { n = Read(sockfd, recvline, sizeof(recvline)); recvline[n] = 0; if (fputs(recvline, stdout) == EOF) { perr_exit("fputs error"); } } Close(sockfd); return 0; }