繁体   English   中英

使用Threads C ++时套接字无法正确打开

[英]Socket not open correctly when using Threads c++

嘿,尝试使用套接字和线程来实现。 我试图做一个小程序,从一个线程接受客户端,并将客户端的消息添加到队列中。 然后从另一个线程将消息打印到控制台。

但是由于某种原因,当我将过程拆分为2个线程时,套接字无法正确打开,并且侦听函数在WSAGetLastError上返回10022错误。

源代码:

void SlaveThread(queue<char*>* tasks);
void MasterThread(queue<char*>* tasks);

int _tmain(int argc, _TCHAR* argv[])
{
    queue<char*>* tasksQueue = new queue<char*>();

    thread SecondThread(MasterThread,tasksQueue);
    thread FirstThread(SlaveThread,tasksQueue);

    FirstThread.join();
    SecondThread.join();
    return 0;
};


void SlaveThread(queue<char*>* tasks)
{
    while (true)
    {
        if (!tasks->empty())
        {
            cout << tasks->front() << " Queue size : " << tasks->size() << endl;
            tasks->pop();
        }

        Sleep(1000);
    }
};

void MasterThread(queue<char*>* tasks)
{
    WSAData WinSockData;
    WORD Version = MAKEWORD(2, 1);

    WSAStartup(Version, &WinSockData);

    /* Create socket structure */
    SOCKADDR_IN Server;
    Server.sin_addr.s_addr = inet_addr("10.0.0.7");
    Server.sin_family = AF_INET;
    Server.sin_port = htons(27015);

    SOCKET ListenSock = socket(AF_INET, SOCK_STREAM, NULL);
    SOCKET Connect;
    bind(ListenSock, (SOCKADDR*)&Server, sizeof(Server));
    listen(ListenSock, 1);
    int errno1 = WSAGetLastError();
    cout << "Listening on port 27015" << endl;
    //char buffer[200];
    int size = sizeof(Server);
    while (true)
    {
        if (Connect = accept(ListenSock, (SOCKADDR*)&Server, &size)){
            int errno1 = WSAGetLastError();
            cout << "Connection established.. " << endl;
        }
        //if (recv(ListenSock, buffer, 200, 0) > 0)
        //{
        //  tasks->push(buffer);
        //}
    }

    WSACleanup();
};

任何建议为什么在我向程序添加线程时会中断? 因为在空程序中,只需使用相同的代码打开套接字即可正常工作。

1)使用INADDR_ANY 2)使用:: bind代替bind。 该名称与标准模板库调用不明确。 这就是为什么使用命名空间std不好的原因。

void MasterThread(queue<char*>* tasks)
{
    WSAData WinSockData;
    WORD Version = MAKEWORD(2, 1);

    WSAStartup(Version, &WinSockData);

    /* Create socket structure */
    SOCKADDR_IN Server;
    Server.sin_addr.s_addr = INADDR_ANY;//inet_addr("10.0.0.7");
    Server.sin_family = AF_INET;
    Server.sin_port = htons(27015);

    SOCKET ListenSock = socket(AF_INET, SOCK_STREAM, NULL);
    SOCKET Connect;
    ::bind(ListenSock, (SOCKADDR*)&Server, sizeof(Server));
    int errno0 = WSAGetLastError();
    listen(ListenSock, 1);
    int errno1 = WSAGetLastError();
    cout << "Listening on port 27015" << endl;
    //char buffer[200];
    int size = sizeof(Server);
    while (true)
    {
        if (Connect = accept(ListenSock, (SOCKADDR*)&Server, &size)){
            int errno1 = WSAGetLastError();
            cout << "Connection established.. " << endl;
        }
        //if (recv(ListenSock, buffer, 200, 0) > 0)
        //{
        //  tasks->push(buffer);
        //}
    }

    WSACleanup();
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM