windows socket 服务器使用select模型连接多个客户端

Posted xuqiulin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows socket 服务器使用select模型连接多个客户端相关的知识,希望对你有一定的参考价值。

server

//socket 使用select模型 连接多个客户端
int function05() 
    SOCKET sktServ = init("0.0.0.0", 8080);
    if (sktServ == INVALID_SOCKET) 
        return -1;
    

    fd_set fds;
    FD_ZERO(&fds);//清空集合
    FD_SET(sktServ, &fds);//将服务器socket放入集合

    timeval tv = 0, 300;
    while (true) 
        fd_set readfds = fds;//初始化监听的集合
        int iret = select(0, &readfds, NULL, NULL, &tv);
        if (iret < 0) 
            printf("[server] select error ...\n");
            break;
        
        if (iret == 0) //集合中套接字没有响应的
            continue;
        
        for (u_int i = 0; i < readfds.fd_count; ++i) 
            SOCKET skt = readfds.fd_array[i];
            if (skt == sktServ) //有新的客户端请求连接
                sockaddr_in addr = 0;
                int addrlen = sizeof(addr);
                SOCKET sktCli = accept(skt, (sockaddr *)&addr, &addrlen);
                if (sktCli == INVALID_SOCKET) 
                    printf("[server] accept error ...\n");
                    continue;
                
                printf("socket:%d ip:%s port:%d join ...\n", sktCli, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
                FD_SET(sktCli, &fds);//将新连接的客户端放入集合
                continue;
            
            //客户端响应请求
            char buf[1024] = 0;
            iret = recv(skt, buf, sizeof(buf), 0);
            if (iret == SOCKET_ERROR) //接受错误
                printf("[server] recv error ...\n");
                FD_CLR(skt, &fds);//将客户端在集合中清除
                closesocket(skt);//关闭客户端socket
                continue;
            
            if (iret == 0) //客户端退出
                printf("[client] exit ...\n");
                FD_CLR(skt, &fds);//将客户端在集合中清除
                closesocket(skt);//关闭客户端socket
                continue;
            
            printf("[client] msg: %s\n", buf);
            if (strcmp(buf, "getName") == 0) 
                sprintf(buf, "%s", "爱白菜的小昆虫.");
            
            else if (strcmp(buf, "getAge") == 0) 
                sprintf(buf, "%s", "100000.");
            
            else 
                sprintf(buf, "%s", "????.");
            
            send(skt, buf, strlen(buf) + 1, 0);
        
    

    printf("[server] exit ...\n");
    FD_CLR(sktServ, &fds);//清除集合中的服务器socket
    destroy(sktServ);
    return 0;

client

//socket简单的客户端代码
int function05() 
    SOCKET sktCli = init("192.168.3.18", 8080);
    if (sktCli == INVALID_SOCKET) 
        return -1;
    

    char buf[1024];
    while (true) 
        printf("*************************\n");
        printf("*getName                *\n");
        printf("*getAge                 *\n");
        printf("*exit                   *\n");
        printf("*************************\n");
        scanf("%s", buf);
        if (strcmp(buf, "exit") == 0) 
            break;
        
        int iret = send(sktCli, buf, strlen(buf) + 1, 0);
        if (iret == SOCKET_ERROR) 
            printf("[client] send error ...\n");
            return -1;
        
        printf("[client] %s send success ...\n", buf);
        iret = recv(sktCli, buf, sizeof(buf), 0);
        if (iret == SOCKET_ERROR) 
            printf("[client] recv error ...\n");
            return -1;
        
        if (iret == 0) 
            printf("[client] server exit ...\n");
            return -1;
        
        printf("[server] msg: %s\n", buf);
    

    destroy(sktCli);
    return 0;

 

以上是关于windows socket 服务器使用select模型连接多个客户端的主要内容,如果未能解决你的问题,请参考以下文章

Linux客户端和Window服务器端udp socket通信不能成功

建立window和iPad之间的Socket连接

pyinstaller:确定 Windows 服务中 socket.io 和 aiohttp 的隐藏导入

Socket网络编程

windows下的socket网络编程(入门级)

将 c++ unix server/socket 连接到 java windows client/socket