Socket罢工了,请帮忙!!!
我有如下代码,请帮帮我!!
CsocketClient: public CSocket{…}
……
void CSocketServer::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
CSocketClient *pSocket = new CSocketClient(m_nSocketID++);
if(pSocket==NULL)
return;
if(!Accept(*pSocket))
{
delete pSocket;
return;
}
gListClient.AddHead(pSocket); //gListClient:CPtrList对象
pSocket->Send(pBuf ,nLen , 0) //正确发送,客户也接收到正确地数据pBuf为BYTE数组
}
…….
…….
POSITION pos;
CSocketClient *pSocket = NULL;
pos = m_pListClient->GetHeadPosition();
while (pos != NULL)
{
pSocket = m_pListClient->GetNext(pos);
if (pSocket != NULL)
{
if (pSocket->m_nSocketID == nSockID )
{
pSocket->Send(pBuf,nLen,0) // 发送不出去,
int nErr = GetLastError(); //nErr==10036:操作被阻塞了。被一直阻塞下去了,永不翻身!!!
}
}
}
谢谢!!!!
问题点数:100、回复次数:10Top
1 楼lizmei001(暗黑)回复于 2002-04-23 09:53:17 得分 0
pSocket->Send(pBuf ,nLen , 0) //正确发送,客户也接收到正确地数据pBuf为BYTE数组
你的pBuf在哪儿定义的
呵呵,先检查你的pBuf吧,应该是它溢出了:)Top
2 楼jyc_nj(老蔣)回复于 2002-04-23 09:56:19 得分 0
WSAEINPROCESS错误,进程里存在阻塞socket了。
你这个作法很有意思,有一个线程中accept来自client的socket(大概是在线程里吧),放入链表,再在另一处,依次取出每个clientsocket,发送。即使这种阻塞作法好象正常,但有一个明显的失误:如果只有你当前操作的socket是阻塞状态,而其他的都是可send的,岂不是一个人拖了大家的后腿?
所以,如果你不得不把对所有client的操作都作在一个while(也就是一个线程里),那你最好用些非阻塞的方法,比如,用select来先测试哪些socket是非阻塞状态。或者其他方法。Top
3 楼ufox(不懂才问)回复于 2002-04-23 09:58:58 得分 0
pSocket->Send(pBuf,nLen,0) // 发送不出去,
我调试过,发现pBuf没有问题,定义为BYTE pBuf[50], nLen的值为27Top
4 楼ufox(不懂才问)回复于 2002-04-23 10:16:16 得分 0
为什么会被阻塞呢!!!Top
5 楼sexfreebird(自由鸟)回复于 2002-04-23 10:36:02 得分 0
我也觉得应该是pBuf有问题,nLen是什么类型的?你把nLen再设的小一点试试吧!Top
6 楼7009lp(寒)回复于 2002-04-23 10:39:43 得分 0
socket编程
1、不用MFC中的类,这在VC6技术内幕中有具体的说明。
2、如果是98下,应用重叠操作,即:WSASend等函数,这样不会阻塞,具体例程可以看MSDN在线帮助
Top
7 楼7009lp(寒)回复于 2002-04-23 10:46:44 得分 0
尤其MFC类在线程中不安全Top
8 楼shenleav(午枫)回复于 2002-04-23 10:57:05 得分 0
跟微软的例子差不多,应该没问题吧!Top
9 楼xgwlg(百事可乐)回复于 2002-04-23 11:29:44 得分 0
??Top
10 楼Javatomchen()回复于 2002-04-25 11:59:35 得分 100
拿分来Top




