2016-12-07 2 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 [я] становится NULL, после второго подключения ко всем разъемам, включая m_sConnected [0].

Закрытие сокетов или уничтожение приложения для моделирования Создайте сокет рядом со стороной сервера для всех открытых потоков для сокетов прослушивания.

В чем проблема? Могу ли я использовать тот же процесс/поток для всех моих сокетов?

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(); 
} } 

когда вы приложите сокет к потоку, то он будет работать.

ссылка майкрософт документ: https://msdn.microsoft.com/en-us/library/wxzt95kb.aspx

+0

Daniel Привет, спасибо вам ответ. Я не поместил весь свой код (моя ошибка). На стороне сервера я делаю отсоединение и возобновление. Моя проблема заключается в стороне клиента - серверная сторона открывает несколько сокетов и получает индикацию для каждого гнезда нитей сервера, включая указание закрытия сокета. – UrAv

+0

Вы путешествуете по порту? beacose, похоже, что вы используете один и тот же номер –

+0

, не помните, что не видите, что вы используете функцию create. это будет esier, чтобы понять, где ошибка, если вы вставьте больше своего кода. –

0

ваше решение работает для меня. Я использовал несколько потоков для стресс-тестирования сервера в C++ под Linux. Вставляя мой код, он будет полезен кому-то ... Эксперты могут улучшить мой код, если они найдут какие-то недостатки в моей обработке кода. Я знаю, что я делаю что-то неправильно, но никто другой не проверяет сервер, поскольку никто до сих пор не разрешил это решение. Я могу проверить сервер на 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

i пропустил pthread_join() после if (p = pthread_create (& sniffer_thread [i], NULL, connection_handler, (void *) new_sock) <0) { perror ("не удалось создать нить"); return 1; } – user3863946

Смежные вопросы