广东建设公司网站画册封面设计

当前位置: 首页 > news >正文

广东建设公司网站,画册封面设计,免费优化网站排名,开源社区的发展前景文章目录#xff1a; 一#xff1a;wrap常用函数封装 wrap.h
wrap.c server.c client.c 二#xff1a;多进程process并发服务器 实现思路 server.c服务器 client.c客户端 三#xff1a;多线程thread并发服务器 实现思路 server.c服务器 client.c客户端 一 一wrap常用函数封装 wrap.h  wrap.c server.c client.c 二多进程process并发服务器 实现思路 server.c服务器 client.c客户端 三多线程thread并发服务器 实现思路 server.c服务器 client.c客户端 一wrap常用函数封装 wrap.h  #ifndef __WRAPH #define __WRAP_H_void perr_exit(const char *s); int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr); int Bind(int fd, const struct sockaddr *sa, socklen_t salen); int Connect(int fd, const struct sockaddr *sa, socklen_t salen); int Listen(int fd, int backlog); int Socket(int family, int type, int protocol); ssize_t Read(int fd, void *ptr, size_t nbytes); ssize_t Write(int fd, const void *ptr, size_t nbytes); int Close(int fd); ssize_t Readn(int fd, void *vptr, size_t n); ssize_t Writen(int fd, const void *vptr, size_t n); ssize_t my_read(int fd, char *ptr); ssize_t Readline(int fd, void *vptr, size_t maxlen);#endif wrap.c #include stdlib.h #include stdio.h #include unistd.h #include errno.h #include sys/socket.hvoid perr_exit(const char *s) {perror(s);exit(-1); }int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr) {int n;again:if ((n accept(fd, sa, salenptr)) 0) {if ((errno ECONNABORTED) || (errno EINTR))goto again;elseperr_exit(accept error);}return n; }int Bind(int fd, const struct sockaddr *sa, socklen_t salen) {int n;if ((n bind(fd, sa, salen)) 0)perr_exit(bind error);return n; }int Connect(int fd, const struct sockaddr *sa, socklen_t salen) {int n;n connect(fd, sa, salen);if (n 0) {perr_exit(connect error);}return n; }int Listen(int fd, int backlog) {int n;if ((n listen(fd, backlog)) 0)perr_exit(listen error);return n; }int Socket(int family, int type, int protocol) {int n;if ((n socket(family, type, protocol)) 0)perr_exit(socket error);return n; }ssize_t Read(int fd, void *ptr, size_t nbytes) {ssize_t n;again:if ( (n read(fd, ptr, nbytes)) -1) {if (errno EINTR)goto again;elsereturn -1;}return n; }ssize_t Write(int fd, const void *ptr, size_t nbytes) {ssize_t n;again:if ((n write(fd, ptr, nbytes)) -1) {if (errno EINTR)goto again;elsereturn -1;}return n; }int Close(int fd) {int n;if ((n close(fd)) -1)perr_exit(close error);return n; }/参三: 应该读取的字节数 读 N 个字节/ //socket 4096 readn(cfd, buf, 4096) nleft 4096-1500 ssize_t Readn(int fd, void *vptr, size_t n) {size_t nleft; //usigned int 剩余未读取的字节数ssize_t nread; //int 实际读到的字节数char *ptr;ptr vptr;nleft n; //n 未读取字节数while (nleft 0) {if ((nread read(fd, ptr, nleft)) 0) {if (errno EINTR)nread 0;elsereturn -1;} else if (nread 0)break;nleft - nread; //nleft nleft - nread ptr nread;}return n - nleft; }ssize_t Writen(int fd, const void *vptr, size_t n) {size_t nleft;ssize_t nwritten;const char *ptr;ptr vptr;nleft n;while (nleft 0) {if ( (nwritten write(fd, ptr, nleft)) 0) {if (nwritten 0 errno EINTR)nwritten 0;elsereturn -1;}nleft - nwritten;ptr nwritten;}return n; }static ssize_t my_read(int fd, char *ptr) {static int read_cnt;static char *read_ptr;static char read_buf[100];if (read_cnt 0) { again:if ( (read_cnt read(fd, read_buf, sizeof(read_buf))) 0) { //hello\nif (errno EINTR)goto again;return -1;} else if (read_cnt 0)return 0;read_ptr read_buf;}read_cnt–;*ptr *read_ptr;return 1; }/readline读一行 — fgets/
//传出参数 vptr ssize_t Readline(int fd, void *vptr, size_t maxlen) {ssize_t n, rc;char c, *ptr;ptr vptr;for (n 1; n maxlen; n) {if ((rc my_read(fd, c)) 1) { //ptr[] hello\n*ptr c;if (c \n)break;} else if (rc 0) {*ptr 0;return n-1;} elsereturn -1;}*ptr 0;return n; } 利用封装函数 联合编译server.c 和 wrap.c 生成 server、 联合编译 client.c 和 wrap.c 生成 client server.c #include stdio.h #include unistd.h #include sys/types.h #include sys/socket.h #include strings.h #include string.h #include ctype.h #include arpa/inet.h#include wrap.h#define SERV_PORT 6666int main(void) {int sfd, cfd;int len, i;char buf[BUFSIZ], clie_IP[BUFSIZ];struct sockaddr_in serv_addr, clie_addr;socklen_t clie_addr_len;sfd Socket(AF_INET, SOCK_STREAM, 0);int opt 1;setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));bzero(serv_addr, sizeof(serv_addr)); serv_addr.sin_family AF_INET; serv_addr.sin_addr.s_addr htonl(INADDR_ANY); serv_addr.sin_port htons(SERV_PORT); Bind(sfd, (struct sockaddr *)serv_addr, sizeof(serv_addr));Listen(sfd, 2); printf(wait for client connect …\n);clie_addr_len sizeof(clie_addr_len);cfd Accept(sfd, (struct sockaddr *)clie_addr, clie_addr_len);printf(cfd —-%d\n, cfd);printf(client IP: %s port:%d\n, inet_ntop(AF_INET, clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie_addr.sin_port));while (1) {len Read(cfd, buf, sizeof(buf));Write(STDOUT_FILENO, buf, len);for (i 0; i len; i)buf[i] toupper(buf[i]);Write(cfd, buf, len); }Close(sfd);Close(cfd);return 0; }client.c #include stdio.h #include unistd.h #include string.h #include sys/socket.h #include arpa/inet.h#include wrap.h#define SERV_IP 127.0.0.1 #define SERV_PORT 6666int main(void) {int sfd, len;struct sockaddr_in serv_addr;char buf[BUFSIZ]; sfd Socket(AF_INET, SOCK_STREAM, 0);bzero(serv_addr, sizeof(serv_addr)); serv_addr.sin_family AF_INET; inet_pton(AF_INET, SERV_IP, serv_addr.sin_addr.s_addr); serv_addr.sin_port htons(SERV_PORT); Connect(sfd, (struct sockaddr *)serv_addr, sizeof(serv_addr));while (1) {fgets(buf, sizeof(buf), stdin);int r Write(sfd, buf, strlen(buf)); printf(Write r %d\n, r);len Read(sfd, buf, sizeof(buf));printf(Read len %d\n, len);Write(STDOUT_FILENO, buf, len);}Close(sfd);return 0; } read 函数的返回值 read 函数的返回值1. 0 实际读到的字节数2. 0 已经读到结尾对端已经关闭【 重 点 】3. -1 应进一步判断errno的值errno EAGAIN or EWOULDBLOCK: 设置了非阻塞方式 读。 没有数据到达。 errno EINTR 慢速系统调用被 中断。errno “其他情况” 异常。 二多进程process并发服务器 使用多进程并发服务器时要考虑以下几点1.父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)2.系统内创建进程个数(与内存大小相关)3.进程创建过多是否降低整体服务性能(进程调度) 实现思路 1. Socket(); 创建 监听套接字 lfd2. Bind() 绑定地址结构 Strcut scokaddr_in addr;3. Listen(); 4. while (1) {cfd Accpet(); 接收客户端连接请求。pid fork();if (pid 0){ 子进程 read(cfd) — 小-》大 — write(cfd)close(lfd) 关闭用于建立连接的套接字 lfdread()小–大write()} else if pid 0 { close(cfd); 关闭用于与客户端通信的套接字 cfd contiue;}}5. 子进程close(lfd)read()小–大write() 父进程close(cfd);注册信号捕捉函数 SIGCHLD在回调函数中 完成子进程回收while waitpid(); server.c服务器 #include stdio.h #include string.h #include netinet/in.h #include arpa/inet.h #include signal.h #include sys/wait.h #include ctype.h #include unistd.h#include wrap.h#define MAXLINE 8192 #define SERV_PORT 8000void do_sigchild(int num) {while (waitpid(0, NULL, WNOHANG) 0); }int main(void) {struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;char buf[MAXLINE];char str[INET_ADDRSTRLEN];int i, n;pid_t pid;struct sigaction newact;newact.sa_handler do_sigchild;sigemptyset(newact.sa_mask);newact.sa_flags 0;sigaction(SIGCHLD, newact, NULL);listenfd Socket(AF_INET, SOCK_STREAM, 0);int opt 1;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));bzero(servaddr, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr htonl(INADDR_ANY);servaddr.sin_port htons(SERV_PORT);Bind(listenfd, (struct sockaddr *)servaddr, sizeof(servaddr));Listen(listenfd, 20);printf(Accepting connections …\n);while (1) {cliaddr_len sizeof(cliaddr);connfd Accept(listenfd, (struct sockaddr )cliaddr, cliaddr_len);printf(————————-%d\n, connfd);pid fork();if (pid 0) {Close(listenfd);while (1) {n Read(connfd, buf, MAXLINE);if (n 0) {printf(the other side has been closed.\n);break;}printf(received from %s at PORT %d\n,inet_ntop(AF_INET, cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));for (i 0; i n; i)buf[i] toupper(buf[i]);Write(STDOUT_FILENO, buf, n);Write(connfd, buf, n);}Close(connfd);return 0;} else if (pid 0) {Close(connfd);} elseperr_exit(fork);}return 0; } client.c客户端 / client.c */ #include stdio.h #include string.h #include unistd.h #include netinet/in.h #include arpa/inet.h#include wrap.h#define MAXLINE 8192 #define SERV_PORT 8000int main(int argc, char *argv[]) {struct sockaddr_in servaddr;char buf[MAXLINE];int sockfd, n;sockfd Socket(AF_INET, SOCK_STREAM, 0);bzero(servaddr, sizeof(servaddr));servaddr.sin_family AF_INET;inet_pton(AF_INET, 127.0.0.1, servaddr.sin_addr);servaddr.sin_port htons(SERV_PORT);Connect(sockfd, (struct sockaddr *)servaddr, sizeof(servaddr));while (fgets(buf, MAXLINE, stdin) ! NULL) {Write(sockfd, buf, strlen(buf));n Read(sockfd, buf, MAXLINE);if (n 0) {printf(the other side has been closed.\n);break;}elseWrite(STDOUT_FILENO, buf, n);}Close(sockfd);return 0; } 三多线程thread并发服务器 在使用线程模型开发服务器时需考虑以下问题1.调整进程内最大文件描述符上限2.线程如有共享数据考虑线程同步3.服务于客户端线程退出时退出处理。退出值分离态4.系统负载随着链接客户端增加导致其它线程不能及时得到CPU 实现思路 1. Socket(); 创建 监听套接字 lfd2. Bind() 绑定地址结构 Strcut scokaddr_in addr;3. Listen(); 4. while (1) { cfd Accept(lfd, );pthread_create(tid, NULL, tfn, (void *)cfd);pthread_detach(tid); // pthead_join(tid, void **); 新线程—专用于回收子线程}5. 子线程void *tfn(void *arg) {// close(lfd) 不能关闭。 主线程要使用lfdread(cfd)小–大write(cfd)pthread_exit(void *)10; } server.c服务器 #include stdio.h #include string.h #include arpa/inet.h #include pthread.h #include ctype.h #include unistd.h #include fcntl.h#include wrap.h#define MAXLINE 8192 #define SERV_PORT 8000struct s_info { //定义一个结构体, 将地址结构跟cfd捆绑struct sockaddr_in cliaddr;int connfd; };void *do_work(void *arg) {int n,i;struct s_info ts (struct s_info)arg;char buf[MAXLINE];char str[INET_ADDRSTRLEN]; //#define INET_ADDRSTRLEN 16 可用[d查看while (1) {n Read(ts-connfd, buf, MAXLINE); //读客户端if (n 0) {printf(the client %d closed…\n, ts-connfd);break; //跳出循环,关闭cfd}printf(received from %s at PORT %d\n,inet_ntop(AF_INET, (*ts).cliaddr.sin_addr, str, sizeof(str)),ntohs((*ts).cliaddr.sin_port)); //打印客户端信息(IP/PORT)for (i 0; i n; i) buf[i] toupper(buf[i]); //小写–大写Write(STDOUT_FILENO, buf, n); //写出至屏幕Write(ts-connfd, buf, n); //回写给客户端}Close(ts-connfd);return (void *)0; }int main(void) {struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;pthread_t tid;struct s_info ts[256]; //创建结构体数组.int i 0;listenfd Socket(AF_INET, SOCK_STREAM, 0); //创建一个socket, 得到lfdbzero(servaddr, sizeof(servaddr)); //地址结构清零servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr htonl(INADDR_ANY); //指定本地任意IPservaddr.sin_port htons(SERV_PORT); //指定端口号 Bind(listenfd, (struct sockaddr *)servaddr, sizeof(servaddr)); //绑定Listen(listenfd, 128); //设置同一时刻链接服务器上限数printf(Accepting client connect …\n);while (1) {cliaddr_len sizeof(cliaddr);connfd Accept(listenfd, (struct sockaddr )cliaddr, cliaddr_len); //阻塞监听客户端链接请求ts[i].cliaddr cliaddr;ts[i].connfd connfd;pthread_create(tid, NULL, do_work, (void)ts[i]);pthread_detach(tid); //子线程分离,防止僵线程产生.i;}return 0; } client.c客户端 /* client.c */ #include stdio.h #include string.h #include unistd.h #include netinet/in.h #include arpa/inet.h #include wrap.h#define MAXLINE 80 #define SERV_PORT 8000int main(int argc, char *argv[]) {struct sockaddr_in servaddr;char buf[MAXLINE];int sockfd, n;sockfd Socket(AF_INET, SOCK_STREAM, 0);bzero(servaddr, sizeof(servaddr));servaddr.sin_family AF_INET;inet_pton(AF_INET, 127.0.0.1, servaddr.sin_addr.s_addr);servaddr.sin_port htons(SERV_PORT);Connect(sockfd, (struct sockaddr *)servaddr, sizeof(servaddr));while (fgets(buf, MAXLINE, stdin) ! NULL) {Write(sockfd, buf, strlen(buf));n Read(sockfd, buf, MAXLINE);if (n 0)printf(the other side has been closed.\n);elseWrite(STDOUT_FILENO, buf, n);}Close(sockfd);return 0; }