2016-12-07 71 views
0

我試圖爲多個套接字客戶端建立一個模擬。 我的服務器有以下代碼來收聽多個客戶端C++創建多個套接字客戶端

我的套接字來自CAsyncSocket的一個非常簡單的類驅動器,我的環境是Windows MFC。

m_server.Create(....); // with the correct values 
    if (m_server.Listen()==FALSE) 

後來就OnSocketAccept()函數

if (m_server.Accept(tempSock)) 
{ 
    CSocketThread* pThread = (CSocketThread*)AfxBeginThread(RUNTIME_CLASS(CSocketThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
... 

我的模擬應用程序具有下面的代碼:

for (int i = 0; i < numOfClients; i++) 
{ 
    m_sConnected[i].Create(); 
    int rVal = m_sConnected[i].Connect(csIPAddress.GetString(), m_port); 

這是行不通的。

在WireShark中,我可以看到我的(numOfClients = 10例如)10個客戶端連接到不同的客戶端源端口。

但是m_sConnected的每個新的套接字[I]在第二連接至所有插座包括m_sConnected [0]後成爲NULL。

關閉套接字或銷燬模擬應用程序在服務器端爲所有偵聽套接字的開放線程創建套接字關閉。

什麼問題? 我可以爲我的所有套接字客戶端使用相同的進程/線程嗎?

10x

UrAv。

回答

0

你的問題是你沒有使用正確的方式使用CSocketThread對象。
如mentiend在微軟機制的文檔 接受函數後,你需要做到以下幾點:

CSockThread* pSockThread = (CSockThread*)AfxBeginThread(RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
if (NULL != pSockThread) { 
// Detach the newly accepted socket and save 
//the SOCKET handle in our new thread object. 
//After detaching it, it should no longer be 
//used in the context of this thread. 
pSockThread->m_hConnected = sConnected.Detach(); 
pSockThread->ResumeThread(); 
} } 

,當你連接你的插座線,然後它會運行。

鏈接到微軟的DOC: https://msdn.microsoft.com/en-us/library/wxzt95kb.aspx

+0

丹尼爾您好,感謝您的迴應。我沒有把我所有的代碼(我的錯誤)。在服務器端,我正在分離和恢復。我的問題是在客戶端 - 服務器端打開幾個套接字並接收指示給每個服務器線程套接字,包括套接字關閉的指示。 – UrAv

+0

你是否要端口?因爲它看起來像你正在使用同一個 –

+0

沒關係沒有看到你使用的是創建功能。如果您將粘貼更多代碼,那麼更容易理解錯誤的位置。 –

0

您的解決方案已經爲我工作。我已經使用多線程來強調在linux下使用C++測試服務器。粘貼我的代碼,對某些人會有幫助......如果我的代碼處理髮現任何缺陷,專家可以改進我的代碼。我知道,我做錯了什麼,但沒有其他人去測試服務器,因爲到現在爲止還沒有人爲此提供解決方案。我能夠使用此代碼爲100000個客戶端測試服務器。 - Kranti。

包括//爲線程,與lpthread鏈接

void *connection_handler(void *); 

#define PORT 9998 
#define SERVER_IP "127.0.0.1" 
#define MAXSZ 100 
#define MAXSOCK 70000 

int main() 
{ 
int sockfd[MAXSOCK];//to create socket 
int socket_desc , new_socket[MAXSOCK], *new_sock; 
struct sockaddr_in serverAddress;//client will connect on this 
int n; 
char msg1[MAXSZ]; 
char msg2[MAXSZ]; 
int NoOfClients = MAXSOCK; 
memset(msg2,0,100); 
void *ret; 

for(int i=0;i<NoOfClients;i++){ 
//create socket 
sockfd[i]=socket(AF_INET,SOCK_STREAM,0); 
//initialize the socket addresses 
memset(&serverAddress,0,sizeof(serverAddress)); 
serverAddress.sin_family=AF_INET; 
serverAddress.sin_addr.s_addr=inet_addr(SERVER_IP); 
serverAddress.sin_port=htons(PORT); 

//client connect to server on port 
new_socket[i] = connect(sockfd[i],(struct sockaddr *)&serverAddress,sizeof(serverAddress)); 
printf("new socket connected= %d",new_socket[i]); 

pthread_t sniffer_thread[MAXSOCK]; 
new_sock = malloc(sizeof(int)); 
*new_sock = new_socket[i]; 
int p=-1; 
if(p = pthread_create(&sniffer_thread[i] , NULL , connection_handler , (void*) new_sock) < 0) 
{ 
    perror("could not create thread"); 
    return 1; 
} 
} 
return 0; 
} 
/* 
* This will handle connection for each client 
* */ 
void *connection_handler(void *socket_desc) 
{ 
    //Get the socket descriptor 
    int sock = *(int*)socket_desc; 
    int read_size; 
    char *message , client_message[50]; 
    printf("we are in connection handler"); 

    //Send some messages to the server 
    message = "Greetings! I am your connection handler\n"; 
    int wlen = write(sock , message , strlen(message)); 
    printf("write length is %d", wlen); 

    //Free the socket pointer 
    //close(sock); 
    free(sock); 

return 0; 
} 
+0

我錯過了pthread_join()之後if(p = pthread_create(&sniffer_thread [i],NULL,connection_handler,(void *)new_sock) <0) perror(「無法創建線程」); return 1; } – user3863946

相關問題