2016-12-07 7 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); 

動作しません。

In WireShark私の(numOfClients = 10などの)10のクライアントが異なるクライアントソースポートに接続されていることがわかります。

しかしm_sConnectedの各新しいソケット[I]m_sConnected [0]含むすべてのソケットへの第2の接続後にNULLになってきています。

シミュレーションソケットを閉じるか、シミュレーションアプリケーションを破棄すると、待機ソケットのすべての開いているスレッドのソケット側がサーバー側に作成されます。

何が問題ですか? すべてのソケットクライアントに対して同じプロセス/スレッドを使用できますか?

10x

UrAv。

答えて

0

問題は、CSocketThreadオブジェクトを正しい方法で使用していないことです。マイクロソフトdocumention で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(); 
} } 

あなたがスレッドにあなたのソケットを接続したときに、それが実行されます。マイクロソフトドキュメントへ

リンク: https://msdn.microsoft.com/en-us/library/wxzt95kb.aspx

+0

ダニエルこんにちはとのリンクが含まれています。私はすべてのコードを入れなかった(私の間違い)。サーバー側では、切り離して再開しています。私の問題はクライアント側です - サーバー側はいくつかのソケットを開き、ソケットの終了の指示を含む各サーバーのスレッドソケットに指示を受け取ります。 – UrAv

+0

あなたは港を変えますか?同じものを使用しているように見えます –

+0

あなたが作成機能を使用していることを気にしないでください。あなたのコードをもっと貼り付けるならば、どこにエラーがあるのか​​分かりません。 –

0

あなたのソリューションは、私のために働いています。私は複数のスレッドを使用して、Linuxの下でC++でサーバをテストしています。私のコードを貼り付けると、誰かに役立つでしょう...私のコードの扱いに欠陥があると、専門家は私のコードを改善することができます。私は間違ったことをしていますが、これまで誰も解決策を提供していないため、サーバをテストすることはありません。このコードを使用して100000のクライアントのサーバーをテストすることができます。 - クランティ。

は、スレッドのために//あなたの応答をありがとう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

if(p = pthread_create(&sniffer_thread [i]、NULL、connection_handler、(void *)new_sockの後にpthread_join() <0) { perror( "スレッドを作成できませんでした"); リターン1; } – user3863946

関連する問題