#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
fd_set socketSet;
SOCKET sockSrv;
//accept thread
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
cout << "enter in socket check" << endl;
char buf[1024];
while (1)//检测socket网络事件,判断是否有连接和数据读取
{
fd_set    readSet = socketSet;
int   nRetAll = select(0, &readSet, NULL, NULL, NULL);
if (0 < nRetAll)
{
for (int i = 0; i < socketSet.fd_count; i++)//检查是否有数据读取和socket断开
{
if (sockSrv == socketSet.fd_array[i])
{
continue;
}
if (FD_ISSET(socketSet.fd_array[i], &readSet))
{
int nRecv = recv(socketSet.fd_array[i], buf, 1024, 0);
if (0 < nRecv)//有数据接收
{
buf[nRecv] = '\0';
cout << socketSet.fd_array[i] << " socket recv len:"  << nRecv <<  " data:" << buf << endl;
}
else//网络断开
{
cout << "socket disconnect:" << socketSet.fd_array[i] << endl;
closesocket(socketSet.fd_array[i]);
FD_CLR(socketSet.fd_array[i], &socketSet);
}
}
}
if (FD_ISSET(sockSrv, &readSet))//有新连接请求
{
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);
SOCKET sClient = accept(sockSrv, (sockaddr*)&addrRemote, &nAddrLen);
if (sClient != INVALID_SOCKET)
{
FD_SET(sClient, &socketSet);
cout << "recv a new connect:" << sClient << endl;
}
}
}
}
return 0;
}
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);//SDK这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数。表示1.1版本
err = WSAStartup(wVersionRequested, &wsaData);//通过WSAStartup函数完成对Winsock服务的初始化,调用socket必须初始化
if (err != 0) {
cout << "socket init failed"<< endl;
return 0;
}
cout << "socket init ok!" << endl;
sockSrv = socket(AF_INET, SOCK_STREAM, 0);//建立本地流式套接字
cout << "socket fd:" << sockSrv << endl;
SOCKADDR_IN addrSrv;//TCP/IP的地址信息
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;//TCP指定的
addrSrv.sin_port = htons(8888);//端口号
err = bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));//绑定套接字
if (0 != err) {
cout << "socket bind failed" << endl;
return 0;
}
err = listen(sockSrv, 5);//#####监听本地套接字
if (0 != err) {
cout << "socket listen failed" << endl;
return 0;
}
FD_ZERO(&socketSet);
FD_SET(sockSrv, &socketSet);
DWORD threadID;
HANDLE hThread;
hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadID); // 创建线程
while (1) {
//SOCKADDR_IN addrClient;
//int len = sizeof(SOCKADDR);
//SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);//接受链接等待客户端链接,返回客户套接字
Sleep(1000);
}
getchar();
    return 0;
}

windows tcp server select的更多相关文章

  1. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  2. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  3. [转]一个基于完成端口的TCP Server Framework,浅析IOCP

    [转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...

  4. 【转载】C# Tutorial - Simple Threaded TCP Server

    http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server In this tutorial I'm going t ...

  5. windows nfs server for linux

    摘要 在开发嵌入式系统的过程中,为了方便调试与文件共享,需要使用到nfs,即网络文件系统,这位板子的调试测试带来了很大的方便.之前在linux系统下开发,与ARM11核心板 linux系统对接共享也比 ...

  6. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  7. socket - socketserver - start TCP server

    前面提到如何使用socket模块启动tcpserver: 创建socket:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 绑定ip: ...

  8. Windows Server 2003从入门到精通之Windows Media Server流媒体服务器架建[转]

    今天我们来做一个windows media server流媒体格式文件的流媒体服务器. 现在市面上能够买到的一些电影文件有 rm格式和wmv格式.还有一些是DivX技术的avi格式,要想让你的服务器对 ...

  9. SQL Server SELECT逻辑处理顺序

    SQL Server SELECT语句,逻辑处理顺序,虽然SELECT位于语句最前面,它在逻辑处理中,基本上是最后一个被执行的部分. 下面列出查询子句在逻辑上处理顺序: 1.  FROM 2.  WH ...

随机推荐

  1. Redux:Reducers

    action只是描述了“发生了什么事情(导致state需要更新)”,但并不直接参与更新state的操作.state的更新由reducer函数执行. 其基本模式是:(state,action)=> ...

  2. DPDK Mbuf Library(学习笔记)

    1 Mbuf库 Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲. 消息缓冲存储在内存池中,使用Mempool库. 数据结构rte_mbuf通 ...

  3. mysql事务与锁机制详解

    一.事务 1.事务简介 (1)事务的场景 转账:一个账户减少,另一个账户增加.两个动作同时成功或者同时失败.就要开启事务. (2)事务定义 事务是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数 ...

  4. 高效、可维护、组件化的CSS

    如何写出更加高效的CSS? 主要有以下四个关键点: 高效的CSS 可维护的CSS 组件化的CSS hack-free CSS 1.书写高效的CSS代码 * 使用 外联样式 替代行间 样式或者内嵌样式. ...

  5. PAT-1134 Vertex Cover (图的建立 + set容器)

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...

  6. C语言基础知识(一)——关键字

    存储类别说明符变量:auto.register.static.extern._Thread_local.typedef 存储类型限定符:const.volatile.restrict._Atomic ...

  7. 剑指Offer之旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  8. Docker的iptables规则在iptables重启后丢失

    前因后果 1.在跳板机上使用ansible命令测试机器B时,报错如下,于是就怀疑是网络防火墙的问题 10.10.0.86 | FAILED >> { "failed": ...

  9. 02.Django-模板

    模板 1. 简介 模板由HTML代码和逻辑控制代码构成 同一个模板,可以有多个上下文,就可以通过穿件模板对象来渲染多个上下文 创建一个模板就可以多次调用render()方法来渲染上下文 Django模 ...

  10. 基于Basys2开发板的简易电子琴和音乐播放器设计

    背景:华中科技大学 电测综合实验 主要功能:Basys2开发板外接一个扬声器(或无源蜂鸣器也可)实现电子琴和音乐播放器的功能.其中由于开发板上只有4个按键,所以电子琴功能只做了4个音调,分别对应于4个 ...