大神救小弟我,多线程调用Socket的send()函数,某个时刻必断开
大神救我,多线程调用Socket的send()函数,某个时刻必断开啊
这是个老问题了,不过还是不明白,多线程调用g_socket的send,不固定的某个时刻socket就断开了。
要发送到数据都是通过参数传递的,按理不需要加锁。加了也没用。
两个线程,一个线程发图片数据,一个发视频文件。
难道一定要再建个队列保存要发送到数据的指针,然后一个线程不断的取出来发送吗?
谢谢。
------解决方案--------------------
图片和数据都用一个socket发送?
------解决方案--------------------
说实话还真没在两个线程里用一个socket,很怀疑这样是不是不支持,可以查查socket的标准接口的资料
------解决方案--------------------
发送你不要搞多个线程去发,这样没办法达到你的目的,A线程你发10个字节,但是很可能send返回了5,另外一个线程的数据就夹进去了。不要这么搞
------解决方案--------------------
能发全不代表你两个线程的数据不会交叉错乱,再想想
------解决方案--------------------
加锁没问题。你断开的时候,socket错误码是多少,其实wireshark抓包看一眼就知道是谁close的socket了
这是个老问题了,不过还是不明白,多线程调用g_socket的send,不固定的某个时刻socket就断开了。
bool CMySocket::SendData(Header header, LPCVOID lpData)
{
EnterCriticalSection(&m_csSection); //加不加这句都不行
send(&header);
send(lpData);
LeaveCriticalSection(&m_csSection);
}
要发送到数据都是通过参数传递的,按理不需要加锁。加了也没用。
两个线程,一个线程发图片数据,一个发视频文件。
难道一定要再建个队列保存要发送到数据的指针,然后一个线程不断的取出来发送吗?
谢谢。
------解决方案--------------------
图片和数据都用一个socket发送?
------解决方案--------------------
说实话还真没在两个线程里用一个socket,很怀疑这样是不是不支持,可以查查socket的标准接口的资料
------解决方案--------------------
发送你不要搞多个线程去发,这样没办法达到你的目的,A线程你发10个字节,但是很可能send返回了5,另外一个线程的数据就夹进去了。不要这么搞
------解决方案--------------------
能发全不代表你两个线程的数据不会交叉错乱,再想想
------解决方案--------------------
发送你不要搞多个线程去发,这样没办法达到你的目的,A线程你发10个字节,但是很可能send返回了5,另外一个线程的数据就夹进去了。不要这么搞
发送函数有个while循环,检查send返回,应该能保证完全发送。while (left > 0)
{
int nSend = Send(ptr, left);
if (nSend <= 0)
return false;
left -= nSend;
ptr += nSend;
}
能发全不代表你两个线程的数据不会交叉错乱,再想想
多谢。交叉是会交叉,可是我while循环外面加的锁也不行吗,这个锁能不能保证一个包的完整性呢。发送数据如下:bool CMySocket::SendData(Header header, LPCVOID lpData)
{
EnterCriticalSection(&m_csSection); //加不加这句都不行
SendX(&header, headerLen);
SendX(lpData, dataLen);
LeaveCriticalSection(&m_csSection);
}
bool CMySocket::SendX(LPCVOID lpBuf, int nBufLen)
{
int left = nBufLen;
LPBYTE ptr = (LPBYTE)lpBuf;
while (left > 0)
{
int nSend = Send(ptr, left);
if (nSend <= 0)
return false;
left -= nSend;
ptr += nSend;
}
return true;
}
加锁没问题。你断开的时候,socket错误码是多少,其实wireshark抓包看一眼就知道是谁close的socket了