你好,我制作了一个通信协议软件,我遇到了一个问题。问题是当我使用线程进行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字节。如果对类有疑问,请写下评论,我会编辑我的帖子添加类。