广东建设公司网站画册封面设计
- 作者: 五速梦信息网
- 时间: 2026年04月20日 11:07
当前位置: 首页 > 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;
}
- 上一篇: 广东建设工程网站免费软件不收费网站
- 下一篇: 广东建设监理协会网站石桥铺网站建设公司
相关文章
-
广东建设工程网站免费软件不收费网站
广东建设工程网站免费软件不收费网站
- 技术栈
- 2026年04月20日
-
广东恒力建设工程有限公司网站哪家公司的网站做得好
广东恒力建设工程有限公司网站哪家公司的网站做得好
- 技术栈
- 2026年04月20日
-
广东广实建设有限公司网站淘宝网站开发需求分析
广东广实建设有限公司网站淘宝网站开发需求分析
- 技术栈
- 2026年04月20日
-
广东建设监理协会网站石桥铺网站建设公司
广东建设监理协会网站石桥铺网站建设公司
- 技术栈
- 2026年04月20日
-
广东建设厅的工程造价网站郑州app推广公司
广东建设厅的工程造价网站郑州app推广公司
- 技术栈
- 2026年04月20日
-
广东建设厅网站个人怎么登录啊北京装修公司口碑十大排名
广东建设厅网站个人怎么登录啊北京装修公司口碑十大排名
- 技术栈
- 2026年04月20日
