• windows tcp server select


    #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] = '';
    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;
    }
  • 相关阅读:
    python 查看所有的关键字
    使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax问题
    安装Python3.6.2报错:zipimport.ZipImportError: can't decompress data; zlib not available
    在CentOS-7.0中安装Python3.6.2
    批处理基础
    linux创建线程之pthread_create
    嵌入式 printf函数
    滤波算法
    单片机启动文件
    SUID、SGID详解
  • 原文地址:https://www.cnblogs.com/larkin-cn/p/11279949.html
Copyright © 2020-2023  润新知