zoukankan      html  css  js  c++  java
  • windows socket 服务端使用线程连接多个客户端

    server

    //用线程处理一个客户端的收发信息
    DWORD WINAPI ThreadFunc04(LPVOID params) {
        SOCKET skt = (SOCKET)params;
        sockaddr_in addr = {0};
        int addrLen = sizeof(addr);
        getpeername(skt, (sockaddr *)&addr, &addrLen);//获取套接字的信息
    
        char buf[1024];
        int ret;
        while (true) {
            ret = recv(skt, buf, sizeof(buf), 0);
            if (ret == SOCKET_ERROR) {
                printf("[server] recv socket:%d ip:%s port:%d error ...
    ", skt, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
                break;
            }
            if (ret == 0) {
                printf("[client] socket:%d ip:%s port:%d exit ...
    ", skt, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
                break;
            }
            printf("[client] socket:%d ip:%s port:%d
    ", skt, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
            printf("[client] msg: %s
    ", 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);
        }
    
        return 0;
    }
    
    //服务端 使用线程连接多个客户端
    int function04() {
        SOCKET sktServ = init("0.0.0.0", 8080);
        if (sktServ == INVALID_SOCKET) {
            return -1;
        }
    
        DWORD threadId;
        SOCKET sktCli = INVALID_SOCKET;
        sockaddr_in addr = { 0 };
        int addrLen = sizeof(addr);
        while (true) {
            sktCli = accept(sktServ, (sockaddr *)&addr, &addrLen);
            if (sktCli == INVALID_SOCKET) {
                printf("[client] accpet error ...
    ");
                return -1;
            }
            printf("[client] socket:%d ip:%s port:%d accept ...
    ", sktCli, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
    
            //创建线程
            CreateThread(NULL, 0, ThreadFunc04, (LPVOID)sktCli, 0, &threadId);
        }
    
        destroy(sktServ);
        return 0;
    }

    client

    //客户端写数据
    DWORD WINAPI ThreadFunc04(LPVOID params) {
    SOCKET skt = (SOCKET)params;
    int ret;
    char buf[1024];
    while (true) {
    printf("************************* ");
    printf("*getName * ");
    printf("*getAge * ");
    printf("*exit * ");
    printf("************************* ");
    scanf("%s", buf);
    if (strcmp(buf, "exit") == 0) {
    break;
    }
    ret = send(skt, buf, strlen(buf)+1, 0);
    if (ret == SOCKET_ERROR) {
    printf("[client] send error ... ");
    return -1;
    }
    printf("[client] %s send success ... ", buf);
    ret = recv(skt, buf, sizeof(buf), 0);
    if (ret == SOCKET_ERROR) {
    printf("[client] recv error ... ");
    return -1;
    }
    if (ret == 0) {
    printf("[client] server exit ... ");
    return -1;
    }
    printf("[server] msg: %s ", buf);
    }
    return 0;
    }

    //socket客户端 使用线程接受和发送消息
    int function04() {
    SOCKET sktCli = init("192.168.3.18", 8080);
    if (sktCli == INVALID_SOCKET) {
    return -1;
    }

    HANDLE hThread;
    DWORD exitCode;
    DWORD threadId;

    hThread = CreateThread(NULL, 0, ThreadFunc04, (LPVOID)sktCli, 0, &threadId);
    while (true) {
    GetExitCodeThread(hThread, &exitCode);//获取执行码

    if (exitCode != STILL_ACTIVE) {//线程运行完
    break;
    }
    Sleep(1000);
    }
    CloseHandle(hThread);

    printf("ReadThreadFunc04 return %d ", exitCode);
    printf("[client] run end ... ");

    destroy(sktCli);
    return 0;
    }

  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/xuqiulin/p/11441249.html
Copyright © 2011-2022 走看看