带线程的Socket Recv功能

问题描述 投票:0回答:1

你好,我制作了一个通信协议软件,我遇到了一个问题。问题是当我使用线程进行recv函数时,我从socket得到的缓冲区不见了。我试着使用condition_variable和mutex,但响应总是一样的。我认为程序在recv函数完成之前就进入下一行,因为当我在发送函数后使用Sleep(2000)时,程序运行正常,当recv缓冲区大于1024字节时,我的程序失败了。

参数的初始值

bool ok=true
int hıdıdı_hıdıdı=0;

类 ıvır_zıvır


class ıvır_zıvır {
public:
    std::mutex mutex;
    std::condition_variable cv;
};

函数Recv_data

void connect_tcp::Recv_data(SOCKET s,mms_response &response,Signals *signals,bool &ok,ıvır_zıvır &ıvır) {
   LinkedList** list = new LinkedList * [1000];
   uint8_t* buffer = new uint8_t [10000];
   ok = false;
   unique_lock<mutex>lck(ıvır.mutex);
   recv(s, (char*)buffer, 10000, 0);
   ıvır.cv.wait(lck, [] {return hıdıdı_hıdıdı == 1; });
   decode_bytes(response,buffer, list,signals);
}

函数 send_data

int connect_tcp::send_data(SOCKET s, mms_response &response,LinkedList** list,int &j,bool &ok, ıvır_zıvır& ıvır) {
    this_thread::sleep_for(0.3s);
    int i = 0;
    int k = 0;
    uint8_t* buffer = new uint8_t[10000];
    while (i<j)
    {
        for (auto it = list[i]->data.begin(); it != list[i]->data.end(); it++)
        {
            buffer[k]=*it;
            k++;

        }
        i++;

    }
    while (ok==true)
    {
        this_thread::sleep_for(1s);
    }
    int jk = 0;
    {
        jk= send(s, (const char*)buffer, list[0]->size, 0);
        cout << jk << " Bytes sent" << endl;
        this_thread::sleep_for(chrono::seconds(1)); 
    }
    hıdıdı_hıdıdı = 1;
    ıvır.cv.notify_all();
    this_thread::sleep_for(2s);
    hıdıdı_hıdıdı = 0;
    ok = true;
    if (jk == -1) {
        exit(-1);
    }
    i = 0;
    while (i<j) {
        delete list[i]; 
        i++;
    }
    j = 1;
    return jk;
}

调用Recv_data和send_data的函数。

void cotp_connection(Cotp_connection cotp, connect_tcp* connection, mms_response response, LinkedList** list, SOCKET s) {
    int i = 1;
    cotp.Begin_Transport_Protocol(list, i);
    cotp.Header_file(list, i);
    thread t2(&connect_tcp::Recv_data, connection, s, ref(response), nullptr, ref(tt), ref(ıvır));
     connection->send_data( s, response, list, ref(i), ref(tt),ıvır);
     t2.join();
}

connect_tcp类

class connect_tcp
{
public:

    SOCKET ConnectWithTcp();
    int send_data(SOCKET s,mms_response &response, LinkedList** list,int &j,bool &ok,ıvır_zıvır &ıvır);
    connect_tcp();
    connect_tcp(char* ip, int set_port);
    void Close_tcp(SOCKET s);
    void Recv_data(SOCKET s, mms_response& response, Signals* signals, bool& ok, ıvır_zıvır& ıvır);
    boolean s;

private:
    SOCKET server;
    SOCKADDR_IN addr;
    int port;
    WSADATA WSAData;
};

线程输出

CBFPPIOC4$ST$Mod$stVal
CBFPPIOC4$ST$Mod$t
CBFPPIOC4$ST$Op
CBFPPIOC4$ST$Op$general
CBFPPIOC4$ST$Op$═

正确的输出

CBFPPIOC4$ST$Mod$stVal
CBFPPIOC4$ST$Mod$t
CBFPPIOC4$ST$Op
CBFPPIOC4$ST$Op$general
CBFPPIOC4$ST$Op$q
CBFPPIOC4$ST$Op$t
CBFPPIOC4$ST$Str
CBFPPIOC4$ST$Str$dirGeneral
CBFPPIOC4$ST$Str$general
CBFPPIOC4$ST$Str$q
CBFPPIOC4$ST$Str$t

这些输出的缓冲区大于1024字节。如果对类有疑问,请写下评论,我会编辑我的帖子添加类。

c++ multithreading sockets condition-variable
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.