关于CSOCKET的问题!各位大虾~帮帮我!

darksky 2000-07-16 11:14:00
大虾们帮我看看我的程序有什么问题??
我觉的不太对!为什么我每接受一次信息后都必须CLOSE了再 LISTEN才能收到下一次信息??
还有CSOCKET到底是阻塞的还是非阻塞的??



int inet(int S_Port)
{
//入口参数S_Port 端口号(Setting_Port)
//*************************
//****socket过程的开始*****
//*************************


if(!AfxSocketInit()){
AfxMessageBox("WindowsSocket initial failed");
return BAD;
}


int count=0;
char Command_Msg[255];
char Msg[255];
CSocket Server,Listening;



if(!Listening.Create(S_Port)){

AfxMessageBox("socket create failed");
return BAD;
}

if(!Listening.Listen()){
AfxMessageBox("socket listen failed");
return BAD;
}
if(!Listening.Accept(Server)){
AfxMessageBox("socket accept failed!");
return BAD;
}

//命令格式
//@S0.....9 系统命令
//@C0.....9 交谈命令
//@N0.....9 网络命令

while(1){
count=0;
//Command_Msg[0]=0;
count=Server.Receive(Command_Msg,255,0);
if(count<0){
AfxMessageBox("Socket receive failed");
Server.Close();
continue;
}
else{//else begin
Command_Msg[count]=0;
AfxMessageBox(Command_Msg);
//命令选择
switch(GetCommand(Command_Msg,Msg)){
case CMD_ERROR:
AfxMessageBox("CMD_ERROR");
break;
case SHUT_DOWN:

AfxMessageBox("shut down");

ExitWindowsEx(EWX_SHUTDOWN,0);
break;
case REBOOT:
ExitWindowsEx(EWX_REBOOT,0);
default:
break;
}


}//end else if
Server.Close();//为什么我每接受一次信息后都必须CLOSE了
//再 LISTEN才能收到下一次信息??
Listening.Accept(Server);
}//while end
return GOOD;
}
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
meifen 2001-07-13
  • 打赏
  • 举报
回复
4
sxbyl 2000-10-07
  • 打赏
  • 举报
回复
建议使用事件驱动!
flyspirit 2000-10-07
  • 打赏
  • 举报
回复
先问一下, 你是不是知道客户端程序是怎么做的? 如果做成每发一条信息前都和你连接一次,当然要不停accept了
CSocket由CAsyncSocket派生, 是异步的, 也就是说是非阻塞的
ppc207 2000-10-07
  • 打赏
  • 举报
回复
使用Csocket为什么还要用死循环呢,这是个坏做法,他不仅严重占用cpu资源,就算不是阻塞状态,也会出现接收不到的情况。另外在csocke中有两个动作是阻塞的,一个是listen,一个是
receive,程序是不会自动关闭一个正在receive的socket的,他在阻塞,就是停止其他事件一直在接受,当你关闭后才能做另一个阻塞动作,解决办法可以有两种,一种是建立多线程,一个线程
listen,一个线程accept.
第二种方法是,建立消息队列,使用socket轮巡的方法。
这样可以解决。但cpu的利用这个问题要考虑。
BluePenguin 2000-09-30
  • 打赏
  • 举报
回复
你应该从CSocket类中派生一个CListenSocket类,重载CSocket中的OnAccept,并在该函数中调用Accept。有时候MSDN上写的,也不一定全对。
jizy 2000-09-30
  • 打赏
  • 举报
回复
代码没问题。

Accept是将一个连接与Server相关联,也就是说将一个连接赋值给Server,如果Accept检测Server已经有一个未关闭的连接时,就出现一个ASSERT错误。
bird2000 2000-07-18
  • 打赏
  • 举报
回复
liouyun is right.

或许问题出在发送函数。
liouyun 2000-07-16
  • 打赏
  • 举报
回复
CSOCKET是阻塞的,而CASYNCSOCKET是非阻塞的,你可以用一用。
关于要CLOSE才能收信息:
1、你可以看是否接收缓冲区中所有字符都收完了。
2、看接收缓冲区中的内容是不是每次都读走了,还是还保留在缓冲区中,Receive的第三个参数能进行这种设置。
zzh 2000-07-16
  • 打赏
  • 举报
回复
我觉得你的流程好象有点问题。可以直接从CSocket或CAsyncSocket 中派生出一个类来,在客户端,先Create,然后Connect,就可以在OnReceive中处理接收的数据了。服务器端,可以Create,然后Listen,再Accept,把收到的链接SOCKET加入SOCKET队列处理就可以了。MSDN中有一个Chat程序,你可以看一下,会有帮助的。

16,472

社区成员

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

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

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