大神救小弟我,多线程调用Socket的send()函数,某个时刻必断开

大神救我,多线程调用Socket的send()函数,某个时刻必断开啊
这是个老问题了,不过还是不明白,多线程调用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,另外一个线程的数据就夹进去了。不要这么搞
------解决方案--------------------
引用:
Quote: 引用:

发送你不要搞多个线程去发,这样没办法达到你的目的,A线程你发10个字节,但是很可能send返回了5,另外一个线程的数据就夹进去了。不要这么搞

发送函数有个while循环,检查send返回,应该能保证完全发送。
while (left > 0)
{
  int nSend = Send(ptr, left);
  if (nSend <= 0)
     return false;
  left -= nSend;
  ptr += nSend;
}


能发全不代表你两个线程的数据不会交叉错乱,再想想
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

发送你不要搞多个线程去发,这样没办法达到你的目的,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了