#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. Adaboost原理及相关推导

    提升思想 一个概念如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么,这个概率是强可学习的.一个概念如果存在一个多项式的学习算法能够学习它,并且学习的正确率仅比随机猜测略好,那么,这个概念是 ...

  2. intellij tomcat

    VMOption -server -XX:PermSize=128M -XX:MaxPermSize=256m

  3. JavaScript高级技术总结

    正则表达式 正则表达式的作用  正则表达式的作用: 匹配字符串的一种规则,正则表达式的作用主要是用于匹配字符串的 需求: 校验手机号 <!DOCTYPE html> <html la ...

  4. Istio-架构

    读书笔记整理 工作机制:分为控制面和数据面 控制面:Pilot, Mixer(接收来自Envoy上报的数据), Citadel(证书和密钥管理) 数据面:Envoy 工作流程: 自动注入 应用程序启动 ...

  5. LOL源代码娜美皮肤免费领取

    领取地址 http://t.cn/EyOY8zp 截图

  6. 转 vue过滤器使用

    简单介绍一下过滤器,顾名思义,过滤就是一个数据经过了这个过滤之后出来另一样东西,可以是从中取得你想要的,或者给那个数据添加点什么装饰,那么过滤器则是过滤的工具.例如,从['abc','abd','ad ...

  7. c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]

    前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...

  8. 基于 kubeadm 搭建高可用的kubernetes 1.18.2 (k8s)集群二 搭建高可用集群

    1. 部署keepalived - apiserver高可用(任选两个master节点) 1.1 安装keepalived # 在两个主节点上安装keepalived(一主一备) $ yum inst ...

  9. [Objective-C] 001_Hello Objective-C

    "Hello Word"从来都是经典中的经典!今天我们就来个"Hello Objective-C"吧. 启动Xcode(6.3.1),从File菜单中选择New ...

  10. linux:基本指令

    指令标准格式 指令主体 [选项][操作对象] 基础指令 ls 1.ls 列出当前工作目录下的所有文件/文件夹的名称 2.ls  路径 列出指定路径下的所有文件/文件夹的名称 路径: 1.相对路径 会用 ...