socket学习笔记——select函数的使用(windows)
2015-08-18 12:19
281 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define BUF_SIZE 1024 void error_handling(char* message); int main(int argc, char* argv[]) { WSADATA wsadata; SOCKET hServSock, hClntSock; SOCKADDR_IN servAddr, clntAddr; TIMEVAL timeout; fd_set reads, cp_reads; int adr_sz; int str_len, i,fd_num; char buf[BUF_SIZE]; if (argc != 2) { printf("usage:%s <port>\n",argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) error_handling("WSAStartup error"); hServSock = socket(PF_INET, SOCK_STREAM, 0); memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(atoi(argv[1])); if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) error_handling("bind error"); if (listen(hServSock, 5) == SOCKET_ERROR) error_handling("listen error"); FD_ZERO(&reads); FD_SET(hServSock, &reads); while (1) { cp_reads = reads; timeout.tv_sec = 5; if ((fd_num = select(0, &cp_reads, 0, 0, &timeout)) == SOCKET_ERROR) break; if (fd_num == 0) continue; for (i = 0;i < reads.fd_count;i++) { if (FD_ISSET(reads.fd_array[i], &cp_reads)) { if (reads.fd_array[i] == hServSock) { adr_sz = sizeof(clntAddr); hClntSock = accept(hServSock, (SOCKADDR*)&servAddr, &adr_sz); FD_SET(hClntSock, &reads); printf("connected client:%d\n", hClntSock); } else { str_len = recv(reads.fd_array[i], buf, BUF_SIZE - 1, 0); if (str_len == 0) { FD_CLR(reads.fd_array[i], &reads); closesocket(cp_reads.fd_array[i]); printf("closed client:%d\n", cp_reads.fd_array[i]); } else send(reads.fd_array[i], buf, str_len, 0); } } } } closesocket(hServSock); WSACleanup(); return 0; } void error_handling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
相关文章推荐
- selenium及webdriver的原理
- 加速binlog回档研究
- Asp.net Session Cookie机制
- HDU 2023 求平均成绩
- 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权
- Java总的Static关键字
- 任意布局左右随手指滑动
- Random Forest 与 GBDT 的异同
- openocd 如何支持FreeRTOS 8.1.2
- Cocos3d-x 发布第一版
- Python在Windows和在Linux下调用动态链接库的教程
- Docker学习---web应用部署
- hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
- ORM进阶之Hibernate中对象的三大状态解析
- ASP入门(十五)- Global.asa
- HDU 1013 Digital Roots
- hdu1241Oil Deposits
- 详细学习之java简单连接Oracle数据库
- 处理activity销毁的问题
- phpstorm常用快捷键