#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. ORACLE重做日志小结

    1.Redo log特点 重做日志以磁盘I/O为主,将数据库操作记录到日志文件.(磁盘I\O性能有可能成为瓶颈) 每个实例只有一个活动的LGWR(log writer)进程,至少有两个日志组(logf ...

  2. Iterator模式C++实现

    原文链接 #include <iostream> using namespace std; typedef int DATA; class Iterator; // 容器的抽象基类 cla ...

  3. 14.5 Go 爬虫

    14.5 Go 爬虫 爬虫库/框架 henrylee2cn/pholcus 幽灵蛛 星5200 gocrawl 星1700 colly 星7169 hu17889/go_spider 星1400 go ...

  4. redis 主从哨兵02

    一.为什么要复制 1.实现数据的多副本存储,从而可以实现服务的高可用 2.提供更好的读性能,分担读请求 二.复制技术的关键点及难点 1.如何指定被复制对象 2.增量还是全量,以及如何实现增量 3.复制 ...

  5. 理解javascript中的连续赋值

    之前在扒源码时经常看到类似的连续赋值操作:  var a = b = 1;  在某度搜了众多前辈的博客,总算对这骚操作有点眉目. Case analysis 首先,javascript中连续赋值最典型 ...

  6. 从无到有Springboot整合Spring-data-jpa实现简单应用

    本文介绍Springboot整合Spring-data-jpa实现简单应用 Spring-data-jpa是什么?这不由得我们思考一番,其实通俗来说Spring-data-jpa默认使用hiberna ...

  7. Gym101630L Laminar Family

    题目链接:https://cn.vjudge.net/problem/Gym-101630L 题目大意: 对于一个集合的集合,若其中任意两个集合 \(A\) 和 \(B\) 都满足下述三个条件之一:\ ...

  8. uni-app运行到浏览器跨域H5页面的跨域问题解决方案

    官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...

  9. window端口被占用

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportExceptio ...

  10. 百度地图结合ECharts实现复杂覆盖物(Overlay)

    先来看效果图 一 前置知识 官方Overlay-覆盖物的抽象基类 方法 返回值 描述 initialize(map: Map) HTMLElement 抽象方法,用于初始化覆盖物,当调用map.add ...