b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

mfc socket onclose_mfc socket编程_mfc socket onreceive(2)

电脑杂谈  发布时间:2019-07-03 20:10:59  来源:网络整理

aSocket.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);

//

if(!aSocket.Listen(10))

...{

charszError[256]=...{0};

sprintf(szError,"ListenFaild:%d",GetLastError());

AfxMessageBox(szError);

return1;

}

CStringstrText;

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。kw=%c0%ee%d3%ee%b4%ba。kw=%ba%fa%b2%fd%ba%d5&。

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

while(!m_exit)

...{

//接收外部连接

if(!aSocket.Accept(serverSocket))

...{

continue;

mfc socket onreceive_mfc socket onclose_mfc socket编程

}

else

...{

charszRecvMsg[256]=...{0};

charszOutMsg[256]=...{0};

//接收客户端内容:阻塞

serverSocket.Receive(szRecvMsg,256);

sprintf(szOutMsg,"ReceiveMsg:%s ",szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。kw=%c0%ee%d3%ee%b4%ba。kw=%ba%fa%b2%fd%ba%d5&。

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

//发送内容给客户端

serverSocket.Send("HaveReceiveTheMsg",50);

//关闭

serverSocket.Close();

}

}

//关闭

aSocket.Close();

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。ie=gb2312&bs=%ca%fd%d7%d6%b5%e7%ca%d3+%ca%b1%b4%f3%ca%b1%d0%a1&sr=&z=&cl=3&f=8&wd=%ca%fd%d7%d6%b5%e7%ca%d3+%ba%f6%b4%f3%ba%f6%d0%a1&ct=0。%c0%ee%d3%ee%b4%ba/shipin/play/3524ee3a8b0b78a25cef89a8。

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

strText+="HaveClose!";

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

return0;

}

//绑定端口

if(!aSocket.Bind(nPort))

...{

charszError[256]=...{0};

sprintf(szError,"BindFaild:%d",GetLastError());

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。kw=%c0%ee%d3%ee%b4%ba。kw=%ba%fa%b2%fd%ba%d5&。

return1;

}

3) SDK 下的服务器端代码

//子线程函数

unsignedintStartServer(LPVOIDlParam)

...{

//初始化Winsock,AfxSocketInit()也是封装了这些语句,不过AfxSocketInit()所做的事比这里多些

WSADATAwsaData;

//Winsock的版本,建议用1.1,兼容性好

WORDwVersionRequested=MAKEWORD(1,1);

intnResult=WSAStartup(wVersionRequested,&wsaData);

if(nResult!=0)

...{

return1;

}

mfc socket onreceive_mfc socket onclose_mfc socket编程

//-----------------------------------------------------

m_exit=false;

CServerDlg*aDlg=(CServerDlg*)lParam;

CStringstrPort;

aDlg->GetDlgItemText(IDC_EDIT_PORT,strPort);

UINTnPort=atoi(strPort);

//socket------------------------------------------------

//接口对象

SOCKETaSocket,serverSocket;

//寻址相关结构

sockaddr_inserverSockaddr;

kw=%e8%b4%9e%e8%a7%82%e9%97%b2%e4%ba%ba&。word=%e6%88%98%e4%ba%89%e5%89%8d%e7%ba%bf%e6%88%98%e9%98%9f&。kw=%ba%fa%b2%fd%ba%d5&。

m_socket = socket(af_inet, sock_stream, ipproto_tcp)。socket fdsock = socket(af_inet, sock_stream, ipproto_tcp)。sock = socket (af_inet,sock_stream,ipproto_tcp)。

if(aSocket==INVALID_SOCKET)

...{

charszError[256]=...{0};

sprintf(szError,"CreateFaild:%d",GetLastError());

AfxMessageBox(szError);

return1;

}

//注意,该处非常重要,取值的正确与否决定关闭scoket后端口是否能正常释放

BOOLbOptVal=TRUE;

intbOptLen=sizeof(BOOL);

//设置socket选项,SOL_SOCKET和SO_REUSEADDR一起使用,并且后面的参数如上,

关闭scoket后端口便能正常释放

setsockopt(aSocket,SOL_SOCKET,SO_REUSEADDR,(char*)&bOptVal,bOptLen);

//寻址相关结构

sockaddr_inaSockaddr;

memset(&aSockaddr,0,sizeof(aSockaddr));

aSockaddr.sin_family=AF_INET;

aSockaddr.sin_addr.s_addr=htonl(INADDR_ANY);

aSockaddr.sin_port=htons((u_short)nPort);

//绑定:注意参数的类型转换

::bind(m_sock,(sockaddr*)&sockaddr, sizeof(sockaddr)))。::bind(m_sockfd,(sockaddr*)&sockaddr, sizeof(sockaddr)))。bind(socksrv, (sockaddr*)&addrsrv, sizeof(sockaddr))。

...{

charszError[256]=...{0};

sprintf(szError,"BindFaild:%d",GetLastError());

AfxMessageBox(szError);

return1;

}

//

if(listen(aSocket,10)==SOCKET_ERROR)

mfc socket onclose_mfc socket编程_mfc socket onreceive

...{

charszError[256]=...{0};

sprintf(szError,"ListenFaild:%d",GetLastError());

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。kw=%c0%ee%d3%ee%b4%ba。kw=%ba%fa%b2%fd%ba%d5&。

return1;

}

CStringstrText;

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

strText+="ServerStart! ";

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

while(!m_exit)

...{

//接收外部连接,非阻塞

socket socket = serversocket.accept()。 socket socket = serversocket.accept()。socket=serversocket.accept()。

if(serverSocket==INVALID_SOCKET)

...{

continue;

}

else

...{

charszRecvMsg[256]=...{0};

charszOutMsg[256]=...{0};

//接收客户端内容:阻塞

recv(serverSocket,szRecvMsg,256,0);

sprintf(szOutMsg,"ReceiveMsg:%s ",szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

strText+=szOutMsg;

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

//发送内容给客户端

send(serverSocket,"HaveReceiveTheMsg",50,0);

//关闭

closesocket(serverSocket);

}

}

//关闭

closesocket(aSocket);

closesocket(serverSocket);

aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);

%c0%ee%d3%ee%b4%ba/shipin/play/026e82476501383269610bd0。kw=%c0%ee%d3%ee%b4%ba。kw=%ba%fa%b2%fd%ba%d5&。

aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);

//当你使用完Winsock接口后,要调用下面的函数对其占用的资源进行释放

WSACleanup();

return0;

}

3. 总结

1) MFC进行编程的确比较简单, 用的代码比较少, 又容易管理。唯一不好的地方在于很多细节上的东西在资料上不容易查出来, 关联性非常紧密, 象 AfxSocketInit() 函数就是,函数的实现里包含着很多不容易理解的类, 并且记录了非常多的环境信息, 比如创建的线程等等, 这样在主线程调用后子线程没有调用执行 CSocket 的操作就会出错。还有就是有些接口的设计非常离奇, 象 CSocket::Create 的接口就是, 实现上还执行了 CSocket::Bind , 非常不容易被发现。并且MSDN上对 CSocket::Bind 的说明又明显的提示需要显示执行 CSocket::Bind 操作。

对于编程语言的初学者来讲.oop不是一个很容易理解的编程方式.大家虽然都按老师讲的都知道oop的三大特性是继承、封装、多态.并且大家也都知道了如何定义类、方法等面向对象的常用语法.但是一到真正写程序的时候.还是很喜欢用函数式编程来写代码.特别是初学者.很容易陷入一个窘境就是“我知道面向对象.我也会写类.但我依然没发现在使用了面向对象后.对我们的程序开发效率或其它方面带来什么好处.因为我使用函数编程就可以减少重复代码并做到程序可扩展了.为啥子还用面向对象。当我们的代码执行到某个程序块方法处,这个方法上可能你并没有设置相关的断点,此时你可以f11进入此程序块,但是往往我们的项目都是经过很多源代码封装好的方法,有时候进入后,会走很多底层的封装方法mfc socket onclose,需要很多步骤才能真正进入这个函数块,此时将鼠标放在此函数上,会出现相关提示,会告诉你在该文件的哪一行代码处,点击即可直接看到这个函数,然后临时打上断点,按f10或者点击右上角的第二个按钮即可直接进入此函数的断点处。win32编程是windows最“原始”的编程模式,只要有c语言基础就可以,这种编程模式就是采用c语言+windows api调用的方式mfc socket onclose,mfc那些类封装的成员函数,最后也都是调用了windows的api接口。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-110267-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...