Help me! 我的Socket怎么了?看看这段代码...

zyoujie 2001-12-30 12:00:36
我的一段程序在WinNT4.0上运行正常,但在Win2k上不对。
CMySock继承了CSocket
void CMySock::OnReceive(int nErrorCode)
{
CBkfjApp *pApp=(CBkfjApp*)AfxGetApp();
unsigned int port;
GetPeerName(strIp,port);
pApp->strIp=strIp;
pApp->m_pMainWnd->Invalidate();
if(nErrorCode==0)
{
ReadInStream();
}
CSocket::OnReceive(nErrorCode);
Close();
}

void CMySock::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
CBkfjApp *pApp=(CBkfjApp*)AfxGetApp();
// Accept(pApp->Server);
// pApp->Server.AsyncSelect(FD_READ);
CMySock *pServer=new CMySock();
Accept(*pServer);
pServer->AsyncSelect(FD_READ);
// AfxMessageBox("as;djas;d");
}

char CMySock::ReadCmd(void **value,short *length)
{
char cmd;
U_SHORT len;
if(Receive(&cmd,1)>0)
{
switch(cmd)
{
case 'u':
case 'p':
case 'd':
case 'c':
case 'q':
if(Receive(len.ch+1,1)<=0) return 0;
if(Receive(len.ch,1)<=0) return 0;
*length=len.i;
*value=malloc(*length*2+1);
int kkkk;
Sleep(3); //在Win2k下加上此句则可正常运行,但在NT4下不要此句也可正常运行.不正常的现象是下一句的Receive的返回值为1,而*length=2
kkkk=Receive(*value,*length*2);
if(kkkk!=*length*2)
// kkkk=Receive(*(value+1),*length*2-1);
return 0;
*((char *)(*value)+*length*2)=0;
break;
case 'E':
break;
default:
return 0;
break;
}
}
else return cmd;
return cmd;
}


void CMySock::ReadInStream()
{
char ch;
short length;
void *value;
CBkfjApp *pApp=(CBkfjApp*)AfxGetApp();

LPWSTR lpszW;
char ch1;
int i;
char *str;
int len;

ch=ReadCmd(&value,&length);

str=NULL;
while(ch!=0&&ch!='E')
{
for(i=0;i<length;i++)
{
ch1=((char *)value)[i*2];
((char*)value)[i*2]=((char*)value)[i*2+1];
((char*)value)[i*2+1]=ch1;
}
lpszW=(LPWSTR)value;
if(str!=NULL) delete str;
str=new char[length*2+1];
len=WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK|WC_SEPCHARS, lpszW, length, str,length*2+1,NULL,NULL);
str[len]=0;
switch(ch)
{
case 'u': //用户名
user=str;
break;
case 'p': //口令
password=str;
break;
case 'd':
database=str;
break;
case 'c':
flag=0;
sql=str;
break;
case 'q':
flag=1;
sql=str;
break;
case 'E':
case 0:
free(value);
// AfxMessageBox("as;das");
// str=user+password+database;
// AfxMessageBox("kkkkkkk");
// AfxMessageBox(str);
return;
default:
errmsg="ErrorAAA";
break;
}
free(value);
ch=ReadCmd(&value,&length);
}
// if(value) free(value);
// string=user+password+database+sql;
// string="user="+user;
//+";password="+password+";database="+database"+"sql="+sql;
delete str;
}
这种现象为什么?怎么能不要Sleep(3)一句?

...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shesh 2001-12-30
  • 打赏
  • 举报
回复
每次的情况一样么?
在CSocket的Receive是你激活了FD_READ倒是有只能缓冲区提示两个而只收到一个情况.
zyoujie 2001-12-30
  • 打赏
  • 举报
回复
上述情况是随机的,我每次要执行上面的程序3次,每次都有一到两次发生上面的错误,但也有成功的可能。
hujun614 2001-12-30
  • 打赏
  • 举报
回复
建议使用WinSocket API,它能更好的控制通信。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧