[英]Dynamic multi-thread server problem
while(true)
{
Klient temp;
SOCKET client = accept(sock,(struct sockaddr *)&ich,&sin_size);
if (client!= INVALID_SOCKET)
{
int ID = wszyscy.size(); //wszyscy is a vector of Klient structure; ID increments like: 0,1,2,3 etc
memset(&temp,0,sizeof(Klient)); //zero structure
temp.Gniazdo = client; //fill temporary structure
temp.Identyfikator = ID;
temp.Nick = "";
temp.Watek = NULL;
wszyscy.push_back(temp);//Adding
std::cout << ID << std::endl; //Showing ID for test
std::cout << inet_ntoa(ich.sin_addr) << std::endl;//IP
wszyscy[ID].Watek = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Watek,&wszyscy[ID], 0 ,NULL);//Creating thread
}
}
線:
DWORD Watek(LPVOID Dane)
{
const char* tekst_serwera = "Halo, tu server :D\n\0";
Klient *temp = (Klient*) Dane;
send(temp->Gniazdo,tekst_serwera,strlen(tekst_serwera),0);
std::cout << "Podlaczyl sie klient o ID: " << temp->Identyfikator << std::endl;
char bufor[500];
while(true)
{
memset(bufor,0,500);
recv(temp->Gniazdo,bufor,500,0);
std::cout << bufor;
}
}
問題是,當我啟動2個或更多客戶端時,服務器會以歡迎消息的方式發送給它們(tekst_servera),但是當我在第二個已啟動的客戶端上寫一些東西,然后我嘗試在已啟動的客戶端上寫一些東西當第一台服務器獲得80%的CPU使用率並且不接收數據時,只有第一個服務器(它僅發生在第一個啟動的客戶端上)當我執行temp.watek = CreateThread時,push_back服務器仍未響應客戶端第1條消息,但並不落后於地獄。
任何幫助表示贊賞
根據winsock文檔 (msdn.microsoft.com),recv函數將返回以下值之一:
我強烈建議檢查recv()
的返回值,並在必要時終止循環,因為在零和負兩種情況下,您都將陷入循環,調用recv()會立即返回而不會立即阻塞。 這將顯示為CPU使用率高和服務器線程無響應。
在任何情況下,舍棄您調用的函數的返回值都是錯誤的形式,並且僅應在特殊情況下執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.