博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket学习笔记——select函数的使用(windows)
阅读量:6223 次
发布时间:2019-06-21

本文共 2726 字,大约阅读时间需要 9 分钟。

1 #include 
2 #include
3 #include
4 #include
5 6 #define BUF_SIZE 1024 7 void error_handling(char* message); 8 9 int main(int argc, char* argv[])10 {11 WSADATA wsadata;12 SOCKET hServSock, hClntSock;13 SOCKADDR_IN servAddr, clntAddr;14 TIMEVAL timeout;15 fd_set reads, cp_reads;16 17 int adr_sz;18 int str_len, i,fd_num;19 char buf[BUF_SIZE];20 21 if (argc != 2)22 {23 printf("usage:%s
\n",argv[0]);24 exit(1);25 }26 if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)27 error_handling("WSAStartup error");28 29 hServSock = socket(PF_INET, SOCK_STREAM, 0);30 memset(&servAddr, 0, sizeof(servAddr));31 servAddr.sin_family = AF_INET;32 servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);33 servAddr.sin_port = htons(atoi(argv[1]));34 35 if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)36 error_handling("bind error");37 if (listen(hServSock, 5) == SOCKET_ERROR)38 error_handling("listen error");39 40 FD_ZERO(&reads);41 FD_SET(hServSock, &reads);42 43 while (1)44 {45 cp_reads = reads;46 timeout.tv_sec = 5;47 48 if ((fd_num = select(0, &cp_reads, 0, 0, &timeout)) == SOCKET_ERROR)49 break;50 if (fd_num == 0)51 continue;52 53 for (i = 0;i < reads.fd_count;i++)54 {55 if (FD_ISSET(reads.fd_array[i], &cp_reads))56 {57 if (reads.fd_array[i] == hServSock)58 {59 adr_sz = sizeof(clntAddr);60 hClntSock = accept(hServSock, (SOCKADDR*)&servAddr, &adr_sz);61 FD_SET(hClntSock, &reads);62 printf("connected client:%d\n", hClntSock);63 }64 else65 {66 str_len = recv(reads.fd_array[i], buf, BUF_SIZE - 1, 0);67 if (str_len == 0)68 {69 FD_CLR(reads.fd_array[i], &reads);70 closesocket(cp_reads.fd_array[i]);71 printf("closed client:%d\n", cp_reads.fd_array[i]);72 }73 else74 send(reads.fd_array[i], buf, str_len, 0);75 }76 }77 }78 }79 closesocket(hServSock);80 WSACleanup();81 return 0;82 }83 84 void error_handling(char* message)85 {86 fputs(message, stderr);87 fputc('\n', stderr);88 exit(1);89 }

 

转载于:https://www.cnblogs.com/boyiliushui/p/4739068.html

你可能感兴趣的文章
Qt简介
查看>>
JS实现填报时对修改过的单元格进行标识
查看>>
Python数据类型
查看>>
vcsa更改时区及搭建ntp服务器
查看>>
我的友情链接
查看>>
Qt 编程总结
查看>>
Kubernetes新近kubectl及CNI漏洞修复,Rancher 2.2.1发布
查看>>
救援模式;克隆虚拟机;linux机器相互登陆
查看>>
alias命令
查看>>
黑马程序员终于又开公开课了------炫酷IOS瀑布流
查看>>
Java JDK安装
查看>>
使用pure-ftpd搭建ftp服务
查看>>
iOS流布局UICollectionView系列一——初识与简单使用UICollectionView
查看>>
创建扑克测试(二)
查看>>
LNMP+Discuz论坛
查看>>
关机和虚拟机克隆、快照
查看>>
oracle12C 重做日志
查看>>
rsync+shell脚本完成自动化备份
查看>>
Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
查看>>
Excel 2010同时打开多个独立的窗口
查看>>