【问题标题】:C++ Creating multiple socket clientsC++ 创建多个套接字客户端
【发布时间】:2016-12-07 17:14:28
【问题描述】:

我正在尝试为多个套接字客户端构建模拟。 我的服务器有以下代码来监听多个客户端

我的套接字来自 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。

关闭套接字或销毁模拟应用程序在服务器端为侦听套接字的所有打开线程创建套接字关闭。

有什么问题? 我可以为所有套接字客户端使用相同的进程/线程吗?

10 倍

UrAv.

【问题讨论】:

    标签: c++ sockets


    【解决方案1】:

    您的问题是您没有以正确的方式使用 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

    【讨论】:

    • 丹尼尔您好,感谢您的回复。我没有把我所有的代码(我的错误)。在服务器端,我正在分离和恢复。我的问题在客户端 - 服务器端打开几个套接字并接收到每个服务器线程套接字的指示,包括套接字关闭的指示。
    • 你改变端口吗?因为看起来你使用的是同一个
    • 没关系没看到你正在使用创建功能。如果您要粘贴更多代码,则更容易理解错误在哪里。
    • 更新:将客户端更改为不同的线程(与服务器端相同)解决问题。为什么每个客户端套接字必须在不同的线程中。如果我需要不同的线程来对同一个文件有两个描述符(在我看来)
    【解决方案2】:

    您的解决方案对我有用。我在linux下使用了多个线程在c++中对服务器进行了压力测试。粘贴我的代码,这将对某人有所帮助...如果专家在我的代码处理中发现任何缺陷,他们可以改进我的代码。我知道,我做错了,但没有其他人去测试服务器,因为到目前为止还没有人为此提供解决方案。我可以使用此代码为 100000 个客户端测试服务器。 - 克兰蒂。

    include //用于线程,与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;
    }
    

    【讨论】:

    • 我在 if( p = pthread_create( &sniffer_thread[i] , NULL , connection_handler , (void*) new_sock)
    猜你喜欢
    • 2018-03-26
    • 2017-08-11
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多