select机制
来源:互联网 发布:创盈门窗软件 编辑:程序博客网 时间:2024/06/05 07:35
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/ip.h>#include <arpa/inet.h>int client(int connfd){int ret;char buf[256];memset(buf, 0, sizeof(buf));ret = read(connfd, buf, sizeof(buf));if (ret == -1) {perror("server->read");return -1;} else if (ret == 0) {close(connfd);return -1;}printf("buf : %s\n", buf);ret = write(connfd, buf, sizeof(buf));if (ret == -1) {perror("server->write");return -1;}return 0;}int main(int argc, char *argv[]){int listenfd;int ret;socklen_t addrlen;int connfd;pid_t pid;char buf[256];struct sockaddr_in srvaddr;struct sockaddr_in cltaddr;/* 1. 创建服务器(创建一socket套接字);socket */listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1) {perror("server->socket");return -1;}printf("create listenfd = %d success\n", listenfd);/* 2. 设置服务器的IP地址和端口号(将socket和服务器的IP地址和端口号进行绑定);bind */memset(&srvaddr, 0, sizeof(struct sockaddr_in));srvaddr.sin_family = AF_INET;srvaddr.sin_port = htons(9999);srvaddr.sin_addr.s_addr = inet_addr("192.168.2.36");ret = bind(listenfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));printf("port : %d\n", ntohs(srvaddr.sin_port));if (ret == -1) {perror("server->bind");return -1;}printf("bind success !\n");/* 3. 启动监听(启动服务器); listen */ret = listen(listenfd, 1024);if (ret == -1) {perror("server->listen");return -1;}printf("listen success !\n");int fd;int nfds;/* 创建一个集合,用来存储所要读处理的所有的文件描述符*/fd_set readfds;fd_set rfds;/* 添加要读处理的文件描述符 */FD_SET(listenfd, &readfds);nfds = listenfd+1;while(1) {rfds = readfds;/* 检测集合当中是否有继续的文件描述符 */ret = select(nfds, &rfds, NULL, NULL, NULL);/* 轮循 */for (fd = 0; fd < nfds; fd++) {/* 判断,寻找就绪的文件描述符 */if (FD_ISSET(fd, &rfds)) {/* 如果是监听套接字listenfd,则建立连接 */if (fd == listenfd) {memset(&cltaddr, 0, sizeof(cltaddr));addrlen = sizeof(socklen_t);connfd = accept(listenfd, (struct sockaddr *)&cltaddr, &addrlen);if (connfd == -1) {perror("accept");return -1;}printf("connfd = %d\n", connfd);FD_SET(connfd, &readfds);if (connfd >= nfds) {nfds = connfd+1;}//nfds = connfd >= nfds ? connfd+1 : nfds;} else {ret = client(fd);if (ret == -1) {FD_CLR(fd, &readfds);}}}}}close(listenfd);return 0;}
阅读全文
0 0
- select()机制
- select机制
- select机制
- select机制
- Select机制--
- select机制
- select机制
- poll select 机制
- linux select 多路复用机制
- linux select 多路复用机制
- Linux select机制
- linux select 多路复用机制
- linux select机制:
- linux select 多路复用机制
- select机制中FD_SET
- poll和select机制
- 浅谈select多路复用机制
- linux select 多路复用机制
- css的几种移动方式
- 当使包含 applet 程序的页面最小化时
- PowerDesigner连接MySQL逆向生成物理模型
- ubuntu server安装ntp
- vim命令显示行号
- select机制
- RTTI学习及四个实现方法
- 不认识String、StringBuffer和StringBuilder这三兄弟的同学赶紧进来
- 学习笔记32-设计模式
- Django(二)--初相见
- openjudge 开餐馆(动态规划)
- 随机等概率的输出m个不重复的数
- Android -List<T>和ArrayList<T>(),发现你的真身
- 4.tomcat虚拟目录的配置