Использование процессора увеличивается с течением времени TCP/IP
Привет.
Я создал сервер telnet на основе этого кода из
[с/C++] Как закодировать мульти-клиентский сервер на C\++ с помощью потоков - учебники - rohitab.com - форумы[^]
#include <windows.h> #include <stdlib.h> #include <stdio.h> #include <winsock.h> #include "mingw.thread.h" // our thread for recving commands DWORD WINAPI receive_cmds(LPVOID lpParam) { // Here I changed for our needs ! its a warehouse management system. printf("thread created\r\n"); // set our socket to the socket passed in as a parameter SOCKET current_client = (SOCKET)lpParam; // buffer to hold our recived data char buf[100]; // buffer to hold our sent data char sendData[100]; // for error checking int res; // our recv loop while(true) { res = recv(current_client,buf,sizeof(buf),0); // recv cmds Sleep(10); if(res == 0) { MessageBox(0,"error","error",MB_OK); closesocket(current_client); ExitThread(0); } if(strstr(buf,"hello")) { // greet this user printf("\nrecived hello cmd"); strcpy(sendData,"hello, greetz from KOrUPt\n"); Sleep(10); send(current_client,sendData,sizeof(sendData),0); } else if(strstr(buf,"bye")) { // dissconnected this user printf("\nrecived bye cmd\n"); strcpy(sendData,"cya\n"); Sleep(10); send(current_client,sendData,sizeof(sendData),0); // close the socket associted with this client and end this thread closesocket(current_client); ExitThread(0); } else { strcpy(sendData,"Invalid cmd\n"); Sleep(10); send(current_client,sendData,sizeof(sendData),0); } // clear buffers strcpy(sendData,""); strcpy(buf,""); } } int main() { printf("Starting up multi-threaded TCP server by KOrUPt\r\n"); // our masterSocket(socket that listens for connections) SOCKET sock; // for our thread DWORD thread; WSADATA wsaData; sockaddr_in server; // start winsock int ret = WSAStartup(0x101,&wsaData); // use highest version of winsock avalible if(ret != 0) { return 0; } // fill in winsock struct ... server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(123); // listen on telnet port 23 // create our socket sock=socket(AF_INET,SOCK_STREAM,0); if(sock == INVALID_SOCKET) { return 0; } // bind our socket to a port(port 123) if( bind(sock,(sockaddr*)&server,sizeof(server)) !=0 ) { return 0; } // listen for a connection if(listen(sock,5) != 0) { return 0; } // socket that we snedzrecv data on SOCKET client; sockaddr_in from; int fromlen = sizeof(from); // loop forever while ((client = accept(sock, (struct sockaddr*)&from,&fromlen))!= INVALID_SOCKET) { // accept connections client = accept(sock,(struct sockaddr*)&from,&fromlen); printf("Client connected\r\n"); // create our recv_cmds thread and parse client socket as a parameter // CreateThread(NULL, 0,receive_cmds,(LPVOID)client, 0, &thread); // Reaplaced CreateThread with std::thread th_client(receive_cmds,(LPVOID)client); } // shutdown winsock closesocket(sock); WSACleanup(); // exit return 0; }
Что я уже пробовал:
Загрузка процессора увеличивается с течением времени.
Не из-за утечки памяти.
Пожалуйста, помогите мне
Shao Voon Wong
Вы звоните принять дважды! Первый вызов находится в состоянии while, а второй - в цикле while. Уберите одну из них.
Member 4099447
Я забыл прокомментировать второе accept.in это мой код.
Количество потоков не увеличивается из-за того, что у нас есть только 7 ручных устройств, которые общаются с сервером
Stefan_Lang
Хорошо, тогда скажи это своему коду.
Member 4099447
Мне не разрешается публиковать полный код.
Stefan_Lang
Я не сказал почтовый индекс, я имел в виду, что ваш код, похоже, не знает о ваших ручных устройствах и доступном номере! Вы должны поместить такую информацию в свой код, чтобы он не создавал ненужные новые потоки.
Member 4099447
Спасибо.
Я так и сделаю