#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. Django操作session

    session是存放在服务端的,在django中使用session必须要先在数据库中创建django_session表,session相关信息都要依赖此表 获取session request.sess ...

  2. MYSQL LOCK IN SHARE MODE&FOR UPDATE

    SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows read. A shared mode lock enables o ...

  3. 浙工大新生赛莫队处理+区间DP+KMP+分析题

    题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...

  4. URL特殊字符转义

    在URL中,某些特殊字符会被转义成其它项,为了使这些特殊字符能正确表达,需用%加该字符的ASCII码在URL中显示.

  5. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

  6. spark学习笔记总结

    Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用.减少了延时处理,提高 ...

  7. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  8. 全网首发,腾讯T3-3整理Netty学习方案(体系图+项目+学习文档)

    前言: 想要学好一门技术,最起码要对他有一定的了解,起码听说过相应的底层原理的东西吧,最起码你要有一点能和别人交流的内容吧,下面是我精简的一点内容,希望对于大家了解netty能有一点帮助 Netty是 ...

  9. [256个管理学理论]003.鳄鱼法则(Alligator Principle)

    鳄鱼法则(Alligator Principle) 来自于大洋彼岸的让你看不懂的解释: 这是经济学交易技术法则之一,也叫“鳄鱼效应”,它的意思是:假定一只鳄鱼咬住你的脚,如果你用手去试图挣脱你的脚,鳄 ...

  10. Java中的集合(十二) 实现Map接口的WeakHashMap

    Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...