mfc socket 编程技术是什么

MFC Socket_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
共10个文档
格式 文档名称 用户评分 浏览量 下载量MFC socket编程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
MFC socket编程
上传于||文档简介
&&介​绍​M​F​C​ ​S​o​c​k​e​t​编​程​应​用
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢spring104 的BLOG
用户名:spring104
文章数:18
访问量:84790
注册日期:
阅读量:5863
阅读量:12276
阅读量:328235
阅读量:1036330
51CTO推荐博文
以下是使用Socket写的简单服务器和客户端部分代码,主要是让初学者知道socket通信的原理,以及代码的编写方法。#include "stdafx.h"
#include "MTServer.h"
MTServerThread(LPVOID pParam);
ClientThread(LPVOID pParam);
BOOL ParseCmd(char *str, CString& cmd, CString& params);
BOOL SendFile(SOCKET s, CString fname);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
int nRetCode = 0;
cout && "Press ESCAPE to terminate program\r\n";
AfxBeginThread(MTServerThread,0);
while(_getch()!=27);
closesocket(server);
WSACleanup();
return nRetC
MTServerThread(LPVOID pParam)
WSADATA wsaD
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)20248);
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
if(listen(server,10)!=0)
int fromlen=sizeof(from);
while(true)
client=accept(server,
(struct sockaddr*)&from,&fromlen);
AfxBeginThread(ClientThread,(LPVOID)client);
ClientThread(LPVOID pParam)
char buff[512];
BOOL auth=
SOCKET client=(SOCKET)pP
strcpy(buff,"#Server Ready.\r\n");
send(client,buff,strlen(buff),0);
while(true)
n=recv(client,buff,512,0);
if(n==SOCKET_ERROR )
buff[n]=0;
if(ParseCmd(buff,cmd,params))
if(cmd=="QUIT")
if(cmd=="AUTH")
if(params=="passwd")
strcpy(buff,"#You are logged in.\r\n");
strcpy(buff,"!Bad password.\r\n");
send(client,buff,strlen(buff),0);
if(cmd=="FILE")
if(SendFile(client,params))
sprintf(buff,"#File %s sent successfully.\r\n",params);
sprintf(buff,"!File %s could not be opened.\r\n",params);
x=send(client,buff,strlen(buff),0);
strcpy(buff,"!You are not logged in.\r\n");
send(client,buff,strlen(buff),0);
strcpy(buff,"!Invalid command.\r\n");
send(client,buff,strlen(buff),0);
closesocket(client);
BOOL ParseCmd(char *str, CString& cmd, CString& params)
CString tmp=
tmp.TrimLeft();
tmp.TrimRight();
if((n=tmp.Find(' '))==-1)
tmp.MakeUpper();
if(tmp!="QUIT")
cmd=tmp.Left(n);
params=tmp.Mid(n+1);
cmd.MakeUpper();
if((cmd!="AUTH") && (cmd!="FILE"))
BOOL SendFile(SOCKET s, CString fname)
BOOL p=f.Open(fname,CFile::modeRead);
char buff[1024];
while(true)
y=f.Read(buff,1024);
x=send(s,buff,y,0);
if(y&1024)
f.Close();
}下面是客户端部分代码:#include "stdafx.h"
#include "MTSClient.h"
int EndFile(char *buff, int len) ;
int NoFile(char *buff, int len) ;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
const char* servername="127.0.0.1";
if(argc&2)
cout && "Usage :- mtsclient [file1] [file2] [file3] ....\r\n";
WSADATA wsaD
struct hostent *
struct sockaddr_
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret)
conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(conn==INVALID_SOCKET)
if(inet_addr(servername)==INADDR_NONE)
hp=gethostbyname(servername);
addr=inet_addr(servername);
hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
if(hp==NULL)
closesocket(conn);
server.sin_addr.s_addr=*((unsigned long*)hp-&h_addr);
server.sin_family=AF_INET;
server.sin_port=htons(20248);
if(connect(conn,(struct sockaddr*)&server,sizeof(server)))
closesocket(conn);
char buff[512];
z=recv(conn,buff,512,0);
buff[z]=0;
strcpy(buff,"auth passwd\r\n");
send(conn,buff,strlen(buff),0);
z=recv(conn,buff,512,0);
buff[z]=0;
for(int j=1;j&j++)
sprintf(buff,"file %s\r\n",argv[j]);
send(conn,buff,strlen(buff),0);
char fname2[256];
if(!(fname=strrchr(argv[j],'\\')))
strcpy(fname2,argv[j]);
strcpy(fname2,fname+1);
cout && fname2 && " has been saved.\r\n";
f.Open(fname2,CFile::modeCreate | CFile::modeWrite);
bool first=
bool second=
while(true)
z=recv(conn,buff,128,0);
if(z==SOCKET_ERROR)
cout && "\r\n\r\nsocket error socket error socket error\r\n";
if(second)
if(NoFile(buff,128)&128)
cout && "File " && argv[j] && " not found on server\r\n";
if(NoFile(buff,128)&128)
cout && "File " && argv[j] && " not found on server\r\n";
if((b=EndFile(buff,z))&z)
f.Write(buff,b);
cout && fname2 && " has been saved.\r\n";
f.Write(buff,z);
f.Close();
closesocket(conn);
WSACleanup();
int EndFile(char *buff, int len)
for(int u=0;u&(len-4);u++)
if(buff[u]=='#')
if(buff[u+1]=='F')
if(buff[u+2]=='i')
if(buff[u+3]=='l')
if(buff[u+4]=='e')
int NoFile(char *buff, int len)
for(int u=0;u&(len-4);u++)
if(buff[u]=='!')
if(buff[u+1]=='F')
if(buff[u+2]=='i')
if(buff[u+3]=='l')
if(buff[u+4]=='e')
}本代码是来自网络书籍中的源码。本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
请输入验证码:要说起来,这个才是我第一个接触的MFC项目,想想当时第一次真正自己写MFC,连VS都还不太会用,然后网上下下来别的大神写的例程,都觉得超级深奥,所幸这段难熬的日子终于过去了。
  socket在培训时候学QT用过,在Linux和在Windows下原来基本是一样的,只是函数调用上会有所区别。个人认为相对难一点的是CAsyncSocket和CSocket这两个类的选用,理论上来讲就是异步和同步的区别,但实际上网上的例程对这两个类的用法各不相同,想具体了解还是得看看些理论上得知识。
  关于socket的剖析,之前做项目看了一遍,今天又连续看了好几遍,终于算是看懂了一点。网上写得好的也就几篇,然后各种转载,原创大多都是零几年的时候写的。挑了几篇相对简单一点,勉强能半懂的,以后用到socket遇到难题再翻翻:
MFC疑难注解:CAsyncSocket及CSocket:
这篇同步和异步解释得很生动,两个类应用方法也很具体。
MFC SOCKET基础 CAsyncSocket 与 CSocket:
这篇稍微简单,很直接对比了两个类,比较容易看懂。
Socket API,CAsyncSocket,CSocket内幕及其用法:
这篇相对来说比较深奥一点,除了用法还有一点原理的东西。
  线程通信对于菜鸟来讲算是个难点,信息同步和管理什么的是个难题,饶了好大个圈,最终想起了OnAccept()、OnReceive()的办法。之前做单收发这两个函数很好用,没想过多客户端直接加几句就好了。用这个办法的例程大多都是用CSocketFile的,用的时候发现接收马上再发出去好像不行,找不到原因,暂时先用着Receive()和Send(),所以之后还会去再研究的。
  用这两个函数的时候并没有意识是异步,总觉得需要用到线程,可是怎么都想不明白线程从哪里开。这几天仔细去研究才发现,其实这种方法就是异步。由于CSocket的基类是CAsyncSocket,从CSocket继承子类使用,也是间接继承了CAsyncSocket。根据前面大神的博文里介绍,CSocket是通过在CAsyncSocket上面添加轮询实现阻塞的,所以用不上阻塞,其实就只是使用了CAsyncSocket而已。
  理解了这些由来,就决定把继承CSocket改为继承CAsyncSocket。一开始并没有什么问题,但是运行几次过后,connect会报错,GetLassError()得到10035,然后就再也不能连接成功了。再去翻阅了大神们的博文,最终在第二篇找到答案。
  CSocket和CAsyncSocket在使用OnAccept()、OnSend()、OnReceive()和OnClose()这些基本上是一样的,而在OnConnect()上面却会有不同。由于CSocket是阻塞方式,Connect等到连接操作完成,通过返回值判断是否连接成功,而CAsyncSocket则是发出Connect指令后,返回WSAEWOULDBLOCK,并直接往下执行,至于是否连接成功,会等相关连接操作完成后调用OnConnect(),结果放到参数中。而WSAEWOULDBLOCK就是GetLassError()得来的,表明connect正在阻塞。在代码里将判断连接成功与否的代码放到OnConnect()中,并把连接成功的操作放到nErrorCode==0,表明连接成功里面,就可以了。
  po一下成品吧,界面比较简陋。
  左上角是服务器端,其他三个是客户端。能实现服务器对某客户端,服务器对所有客户端,客户端之间的通信。
  屯点积分和下载点数~
  程序有点大,是因为两个Server和Client都保留了Debug。。。可以看了效果再决定要不要看代码,电脑慢星人表示每次都要先编译看了,才发现完全不是自己想要的好心塞。
  忘记注明了,环境是VS2012!!!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2160次
排名:千里之外
原创:13篇&&&&MFC_socket通信实例 MFC_socket通信实例
MFC_socket通信实例 MFC_socket通信实例
MFC_socket通信实例
我是使用VS2012来做的,不知道其他的环境会不会有问题。
使用VS2012分别打开工程AppSocClient和AppSocServer,
分别build两个工程,启动AppSocServer工程,输入appid和message,点击发送,即可。
如果出现create process failed,则可能是函数StartApp()里面的../../AppSocClient/Debug/AppSocClient.exe此路径没有指到对应的AppSocClient.exe。
AppSocClient.exe是服务端启动的,不用手动启动,如果有其他需求,可以自行修改。
输入不同的appid则启动不同的AppSocClient.exe,启动后,再次点击发送会收到AppSocServer.exe发送的消息,。
只要输入appid和message就可以给对应的客户端发消息,是长连接的。
关闭的时候,请先关闭客户端,因为线程没有处理,进程会卡死的。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行

我要回帖

更多关于 mfc socket 编程 的文章

 

随机推荐