zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    asp.net的TextBox回车触发事件
    asp.net 多条件查询
    A Brief History of My Blogs
    每日英语:Singular Success: China’s BillionDollar Hallmark Holiday
    Mat基本图像容器(转)
    VS2010与matlab R2011b混合编程遇到问题及解决
    SIFT算法研究 【转】
    matlab学习:人脸识别之LBP (Local Binary Pattern)
    每日英语:In the Future, Who Will Need Teachers?
    matlab学习:人脸识别之HOG(Histograms of Oriented Gradients)
  • 原文地址:https://www.cnblogs.com/larkin-cn/p/11279949.html
Copyright © 2011-2022 走看看