VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 303|回复: 6
打印 上一主题 下一主题

[求助] SOCKET TCP服务器,客户端一断开cpu占用就飙升

[复制链接]
80_avatar_middle
跳转到指定楼层
1#
在线会员 发表于 2019-9-28 09:54:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3驿站币
搭建SOCKET TCP服务器,客户端不管连多少个进来,只要有其中一个客户端断开CPU就飙升。请问程序里如何监听客户端断开了,并释放资源。
代码如下:
#include <winsock2.h>
#include <iostream>
#include <fstream>

#include <Windows.h>
#include <vector>
#include <map>
#include<string>
#include <stdio.h>

using namespace std;
#pragma comment (lib, "ws2_32.lib")
#define MSGSIZE        1024

char Buffer[MSGSIZE];



map<string, unsigned int> myID;
map<unsigned int, HANDLE> allID;
map<unsigned int, HANDLE>::iterator it;

bool GetLocalIP(char* ip);
HANDLE handle;

unsigned int getStrLenght(char str[]);
DWORD WINAPI Socket_Thread(LPVOID Client_Socket);//创建链表
unsigned int IsMajuscule(string Str);
void TrtransformMajuscule(string Str, char a[]);
void TrtransformLowercase(char str[], char a[]);
int main()
{

        int myhtons = 3002;
        char myIP[20];
        cout << "---------TCP自动转发服务端-------------" << endl;
        cout << "输入监听端口号:";

        WSADATA Wsa_Data;//WSADATA这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据
        if(WSAStartup(MAKEWORD(2,2), &Wsa_Data) != 0)//通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本
        {
                cout << "初始化SOCKET动态库失败!" << endl;
                return 0;
        }
        SOCKET Listen_Socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//(协议,本地地址( 提供面向连接的稳定数据传输,即TCP协议),本地端口)
       
        if(Listen_Socket == INVALID_SOCKET)
        {
                cout << "创建SOCKET错误!" << endl;
                return 0;
        }
       
       
        sockaddr_in Listen_Socket_addr;
        memset(&Listen_Socket_addr, 0, sizeof(Listen_Socket_addr));
        Listen_Socket_addr.sin_family = PF_INET;
        Listen_Socket_addr.sin_addr.s_addr = INADDR_ANY;//inet_addr("61.183.177.10");
        Listen_Socket_addr.sin_port = htons(myhtons);
        if(::bind(Listen_Socket, (SOCKADDR*)&Listen_Socket_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
        {
                cout << "绑定错误!" << endl;
                return 0;
        }
        if(listen(Listen_Socket, 20) == SOCKET_ERROR)
        {
                cout << "监听错误!" << endl;
                return 0;
        }
        GetLocalIP(myIP);
        cout << "服务器启动成功!" <<"IP:"<<myIP <<" "<< myhtons <<" 缓冲区大小:"<< MSGSIZE << endl;
        SOCKET Client_Socket;
        SOCKADDR Client_Socket_addr;
        int Client_Socket_addr_Length = sizeof(Client_Socket_addr);
       
       
        while(1)
        {
               
                Client_Socket = accept(Listen_Socket, (SOCKADDR*)&Client_Socket_addr,
                        &Client_Socket_addr_Length);
                if(Client_Socket == INVALID_SOCKET)
                {
                        cout << "四元SOCKET错误!" << endl;
                        continue;
                }
       

                if(handle = CreateThread(NULL, 0, Socket_Thread, (LPVOID)Client_Socket/*temp[i]*/, 0, NULL)/* && ++i*/)
                {
                        cout << "创建了一个线程:" << handle << "端口"<< Client_Socket <<endl;
                       
                }
               
               
                CloseHandle(handle);       
               
        }
       
        closesocket(Client_Socket);       
        closesocket(Listen_Socket);
        system("pause");
        return 0;
}
DWORD WINAPI Socket_Thread(LPVOID Client_Socket)//创建链表
{
        while (1)
        {

                if (recv((SOCKET)Client_Socket, Buffer, MSGSIZE, NULL) > 0)
                {
                        cout << Buffer << endl;
                }
        }
        return 0;
}

最佳答案

查看完整内容

加睡眠,接受失败的时候




上一篇:基本语法崩溃问题
下一篇:新手问题
88_avatar_middle
2#
online_vip 发表于 2019-9-28 09:54:27 来自手机 | 只看该作者
加睡眠,接受失败的时候

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small 敏敏 + 2 + 2 赞一个!

查看全部评分

80_avatar_middle
3#
ico_lz  楼主| 发表于 2019-9-28 11:17:32 | 只看该作者
wyc2008 发表于 2019-9-28 11:07
加睡眠,接受失败的时候

可以了,谢谢,厉害SOCKET TCP服务器,客户端一断开cpu占用就飙升
90_avatar_middle
4#
在线会员 发表于 2019-9-28 11:46:06 | 只看该作者
断开了死循环,不蹦见鬼了

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small 敏敏 + 2 + 2 赞一个!

查看全部评分

80_avatar_middle
5#
ico_lz  楼主| 发表于 2019-9-28 20:48:04 | 只看该作者
美洲人 发表于 2019-9-28 11:46
断开了死循环,不蹦见鬼了

之前设断点找断开的时候在哪循环,没找到
50_avatar_middle
6#
在线会员 发表于 2019-9-30 11:17:00 | 只看该作者
循环是造成高cpu的一个原因
85_avatar_middle
7#
在线会员 发表于 4 天前 | 只看该作者
线程里最好不要一直while(1)。。。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-10 00:48

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表
时时彩平台排名