导航:首页 > 文件教程 > mfcsocket编程教程

mfcsocket编程教程

发布时间:2024-11-02 17:05:38

㈠ MFC中socket编程时recv设置超时属性后,如果超时返回值是什么谢谢大家:)

超时,也是 返回: SOCKET_ERROR
用WSAGetLastError() 获取 id 再分析,程序如下:

memset(buff,0x0,buff_size);
if (recv(sock,buff,sizeof(buff),0) == SOCKET_ERROR){
id = WSAGetLastError();
switch (id)
{
case WSANOTINITIALISED: printf("not initialized\n"); break;
case WSASYSNOTREADY: printf("sub sys not ready\n"); break;
case WSAHOST_NOT_FOUND: printf("name server not found\n"); break;
case WSATRY_AGAIN: printf("server fail\n"); break;
case WSANO_RECOVERY: printf("no recovery\n"); break;
case WSAEINPROGRESS: printf("socket blocked by other prog\n"); break;
case WSANO_DATA: printf("no data record\n"); break;
case WSAEINTR: printf("blocking call canciled\n"); break;
case WSAEPROCLIM: printf("limit exceeded\n");
case WSAEFAULT: printf("lpWSAData in startup not valid\n");
default: printf("unknown error id = %d\n",id); break;
};
printf("receive error.\n");
};

㈡ MFC是如何接收用套接字传来的数据的

一、接收与发送过程:

服务器端

1、创建服务器套接字(CREATE)。

2、服务器套接字进行信息绑定(BIND),并开始监听连接(LISTEN)。

3、接受来自客户端的连接请求(ACCEPT),并创建接收进程。

4、开始数据传输(SEND、RECEIVE)。

5、关闭套接字(CLOSESOCKET)。

客户机端

1、创建客户机套接字(CREATE)。

2、与远程服务器进行连接(CONNECT),如被接受则创建接收进程。

3、开始数据传输(SEND、RECEIVE)。

4、关闭套接字(CLOSESOCKET)。


二、在VC中的实现:

服务器端:

一、建立支持SOCKET项目。

利用APP WIZARD创建MFC EXE项目,进行到WIZARD的第四步时,在“What features would you like include?”中,选中“Windows Sockets”项。其它各步骤各选项根据实际应用进行选择即可。这样创建的项目就已经支持SOCKET,并已经初始化了。

如果要在已有的项目中添加SOCKET支持,只须进行两项工作:

1、在stdafx.h文件中包含头文件WINSOCK.H (#include “winsock.h” )。

2、在应用程序类的成员函数:“::InitInstance()”中添加如下初始化套接字代码

if(!AfxSocketInit())
{AfxMessageBox(IDP_SOCKETS_INIT_FAILED);returnFALSE;}

二、创建服务套接字并创建监听线程。

//创建服务套接字
SOCKETsercon=socket(PF_INET,SOCK_STREAM,0);
//判断是否成功创建
if(sercon==INVALID_SOCKET)
{AfxMessageBox(“ServerWRONG!”);return-1;}
//配置套接字地址等信息
SOCKADDR_INsin;
sin.sin_family=AF_INET;
//指定本地地址
sin.sin_addr.s_addr=htonl(INADDR_ANY);
//指定服务器端口号nPort,可自设
intnPort=5080;
sin.sin_port=htons(nPort);
//地址信息与套接字进行绑定。
if(bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{AfxMessageBox(“bindwrong!”);return-1;}
//建立监听队列(大小为3),开始监听
if(listen(sercon,3)==SOCKET_ERROR)
{AfxMessageBox(“listenwrong!”);return-1;};

①实现监听线程,并创建数据接收线程。

//在程序需要开始监听连接的地方创建监听线程,并实现。

//创建监听线程(在程序开始或按钮事件实现中)

AfxBeginThread(waitconnect,NULL);

//实现监听线程

UINT waitconnect(LPVOID lpParm)

{SOCKET conn[3];int lenc=sizeof(sockaddr);int alreadycon=0;//sercon为前面所创建服务器套接字while(1){if (alreadycon<=3) {//接受连接请求conn[alreadycon]=accept(sercon,&cin,&lenc);if (conn[alreadycon]==INVALID_SOCKET){AfxMessageBox(“accept WRONG !”);}

else

{//创建数据接收线程

AfxBeginThread(readdata,&connn[alreadycon]);

Alreadycon= alreadycon+1;

return 0;}}

else

{//避免影响主线程运行

Sleep(200);}

}

}

②实现数据接收线程。

UINT waitconnect(LPVOID ss)

{ SOCKET *readsock;

readsock=(SOCKET *)ss;

char buf[2000];

int revnum=0;

//开始循环接受数据

while (revnum!=-1)

{//revnum<=0则表示连接已断!

revnum=recv(*readsock,buf,2000,0);

if (revnum>0)

buf[revnum]=0;//截断缓冲区

//buf中存储已接受数据。}

}

③发送数据

//conn[1]为用于接受连接的套接字, sendstr为所发送数据。

send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);

④关闭套接字。

//conn[1]为用于接受连接的套接字

closesocket(conn[1]);

客户程序端:

客户端程序的编程有很多与服务器端相同或相近,甚至相同的代码。

一、建立支持SOCKET项目。

方法同服务器端。

二、创建客户套接字、对服务器进行连接。

//nHost 须用户指定的远程服务机,IP或域名。

CString nHost;

//h为地址信息

struct hostent *h;

h=gethostbyname(nHost);

//nHost 须用户指定的远程服务端口号

int nPort;

SOCKET con_client;

SOCKADDR_IN csin;

if (h!=NULL)

{//创建套接字

con_client =socket(AF_INET,SOCK_STREAM,0);

csin.sin_family=AF_INET;

memcpy(&(csin.sin_addr.s_addr),h->h_addr,sizeof(int));

csin.sin_port=htons(nPort);

//开始连接

if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)))

{//AfxMessageBox(“connect wrong!”);

return -1;}

else

{//连接成功,创建数据接收线程

AfxBeginThread(readdata,&con_client);}

}

三、实现数据接收线程。

代码与服务器端完全相同。

四、发送数据。

//con_client 为与服务器进行连接的套接字。

send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);

五、关闭套接字。

// con_client 为与服务器进行连接的套接字。

closesocket(conn[1]);

在实际应用中,应当根据需要调整并改变一些变量的作用域。

阅读全文

与mfcsocket编程教程相关的资料

热点内容
win10的文件查找在哪里设置密码 浏览:617
苹果6plusitunesstore 浏览:971
qqiphone6在线手机软件 浏览:407
文件怎么转发 浏览:94
数控机床编程与操作怎么启动 浏览:636
linux查找c文件是否存在 浏览:150
从事程序员的身体要求 浏览:259
txt文件转成json文件 浏览:941
iosapp怎么让未读消息显示 浏览:805
百度智能云上传文件软件 浏览:756
怎么把电脑盘设密码 浏览:768
苹果直径怎么量 浏览:542
alienware13升级 浏览:14
循环加载js 浏览:759
qq电话记录在哪个文件夹 浏览:325
jsf如何返回json数据 浏览:136
javascript百度地图 浏览:380
苹果4怎么弄3g网络 浏览:775
如何删除公司文件 浏览:659
u盘歌曲怎么从文件夹剪切出来 浏览:766

友情链接