异步(非阻塞)模式的学习
来源:互联网 发布:故宫攻略 知乎 编辑:程序博客网 时间:2024/06/07 08:20
一、开发了一个阻塞模式的通讯程序
1、初始化socket
WSADATA wsaData;
WORD version=MAKEWORD(2,0);// Set small icon
int ret=WSAStartup(version,&wsaData);
if(ret!=0)
{
MessageBox("Init Error");
return FALSE;
}
2、启动一个监听
if(m_hSocket)//如果已经创建,先关闭
{
closesocket(m_hSocket);
m_hSocket=NULL;
}
else
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket);//
}
CString strError;
m_hSocket;
sockaddr_in addr;
addr.sin_family=AF_INET;//表示在INT上通信
addr.sin_addr.S_un.S_addr=INADDR_ANY;
addr.sin_port=htons(m_iPort);
int ret=0;
int error=0;
ret=bind(m_hSocket,(LPSOCKADDR)&addr,sizeof(addr));//绑定
if(ret==SOCKET_ERROR)
{
strError.Format("Bind Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket);
return;
}
ret=listen(m_hSocket,10);//监听
if(ret==SOCKET_ERROR)
{
strError.Format("Listen Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket);
return ;
}
else
{
m_cState.SetWindowText("服务端已经启动,等待连接中...");
}
AfxBeginThread(ListenThread,this);
3、监听线程
UINT ListenThread(void *p)
{
//准备接受请求
while(1)
{
if(!pDlg->bAppend)
{
AfxEndThread(0);
return 0;
}
CString strError;
int error;
ASSERT(pDlg!=NULL);
struct sockaddr_in FAR addr;
int fromlen;
//SOCKET s=accept(pDlg->m_hSocket,NULL,NULL);
fromlen=sizeof(addr);
SOCKET s=accept(pDlg->m_hSocket,(LPSOCKADDR)&addr,&fromlen);
CString strTmp;
char tmpIP[3];
itoa(addr.sin_addr.S_un.S_un_b.s_b1,tmpIP,10);
strTmp=tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b2,tmpIP,10);
strTmp=strTmp+"."+tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b3,tmpIP,10);
strTmp=strTmp+"."+tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b4,tmpIP,10);
strTmp=strTmp+"."+tmpIP+" connection!";
//pDlg->m_List.AddString(strTmp);
pDlg->WriteLog(strTmp);
if(s==SOCKET_ERROR)
{
if(pDlg->bAppend)
{
strError.Format("Accept Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(pDlg->m_hSocket);
return -1;
}
else
{
break;
}
}
pDlg->RevFile(s);
}
return 0;
}
4、文件接收函数
void CBaGJSocketDlg::RevFile(const SOCKET& s)
{
char buffer[1024];
char temp[1024];
memset(buffer,0,sizeof(buffer));
memset(temp,0,sizeof(temp));
int rcv = recv(s,buffer, 1024, 0);
for (int i=0; buffer[i]!='*'; i++)
{
temp[i] = buffer[i];
}
temp[i++] = '/0';
CString strFileName = temp;//得到文件名
strcpy(temp, buffer + i);
long lFileSize = atol(temp);//文件大小;
m_progress.SetRange32(0, lFileSize); //设置进度条范围
m_progress.SetStep(1); //设置进度条步长
m_progress.ShowWindow(SW_SHOW);
m_cState.SetWindowText("文件正在接收....");
CString tmpStr;
tmpStr="recieve file:"+strFileName;
WriteLog(tmpStr);
m_strFilePath="c://"+strFileName;
//进度条操作//
//接受并保存文件。
CFile file(m_strFilePath, CFile::modeCreate | CFile::modeWrite);
long iTemp = 0;
while (1)
{
rcv = recv(s, buffer, 1024, 0);
if (rcv == 0)
{
break;
}
file.Write(buffer, rcv);
iTemp += rcv;
m_progress.ShowWindow(SW_SHOW);
m_progress.SetPos(iTemp);
}
file.Close();
if (iTemp != lFileSize)
{
AfxMessageBox("文件接收失败!");
}
m_cState.SetWindowText("文件接收成功!");
shutdown(s,SD_BOTH);
closesocket(s);
}
5、日志函数,显示在list中
void CBaGJSocketDlg::WriteLog(LPCTSTR LogText)
{
CString tmp;
CTime curTime=CTime::GetCurrentTime();
tmp=curTime.Format("%Y-%m-%d %H:%M:%S");
tmp=tmp+":"+LogText;
m_List.AddString(tmp);
}
这段代码也不是自有“产权”,也是根据一个Demo改写的
1、初始化socket
WSADATA wsaData;
WORD version=MAKEWORD(2,0);// Set small icon
int ret=WSAStartup(version,&wsaData);
if(ret!=0)
{
MessageBox("Init Error");
return FALSE;
}
2、启动一个监听
if(m_hSocket)//如果已经创建,先关闭
{
closesocket(m_hSocket);
m_hSocket=NULL;
}
else
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket);//
}
CString strError;
m_hSocket;
sockaddr_in addr;
addr.sin_family=AF_INET;//表示在INT上通信
addr.sin_addr.S_un.S_addr=INADDR_ANY;
addr.sin_port=htons(m_iPort);
int ret=0;
int error=0;
ret=bind(m_hSocket,(LPSOCKADDR)&addr,sizeof(addr));//绑定
if(ret==SOCKET_ERROR)
{
strError.Format("Bind Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket);
return;
}
ret=listen(m_hSocket,10);//监听
if(ret==SOCKET_ERROR)
{
strError.Format("Listen Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket);
return ;
}
else
{
m_cState.SetWindowText("服务端已经启动,等待连接中...");
}
AfxBeginThread(ListenThread,this);
3、监听线程
UINT ListenThread(void *p)
{
//准备接受请求
while(1)
{
if(!pDlg->bAppend)
{
AfxEndThread(0);
return 0;
}
CString strError;
int error;
ASSERT(pDlg!=NULL);
struct sockaddr_in FAR addr;
int fromlen;
//SOCKET s=accept(pDlg->m_hSocket,NULL,NULL);
fromlen=sizeof(addr);
SOCKET s=accept(pDlg->m_hSocket,(LPSOCKADDR)&addr,&fromlen);
CString strTmp;
char tmpIP[3];
itoa(addr.sin_addr.S_un.S_un_b.s_b1,tmpIP,10);
strTmp=tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b2,tmpIP,10);
strTmp=strTmp+"."+tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b3,tmpIP,10);
strTmp=strTmp+"."+tmpIP;
itoa(addr.sin_addr.S_un.S_un_b.s_b4,tmpIP,10);
strTmp=strTmp+"."+tmpIP+" connection!";
//pDlg->m_List.AddString(strTmp);
pDlg->WriteLog(strTmp);
if(s==SOCKET_ERROR)
{
if(pDlg->bAppend)
{
strError.Format("Accept Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(pDlg->m_hSocket);
return -1;
}
else
{
break;
}
}
pDlg->RevFile(s);
}
return 0;
}
4、文件接收函数
void CBaGJSocketDlg::RevFile(const SOCKET& s)
{
char buffer[1024];
char temp[1024];
memset(buffer,0,sizeof(buffer));
memset(temp,0,sizeof(temp));
int rcv = recv(s,buffer, 1024, 0);
for (int i=0; buffer[i]!='*'; i++)
{
temp[i] = buffer[i];
}
temp[i++] = '/0';
CString strFileName = temp;//得到文件名
strcpy(temp, buffer + i);
long lFileSize = atol(temp);//文件大小;
m_progress.SetRange32(0, lFileSize); //设置进度条范围
m_progress.SetStep(1); //设置进度条步长
m_progress.ShowWindow(SW_SHOW);
m_cState.SetWindowText("文件正在接收....");
CString tmpStr;
tmpStr="recieve file:"+strFileName;
WriteLog(tmpStr);
m_strFilePath="c://"+strFileName;
//进度条操作//
//接受并保存文件。
CFile file(m_strFilePath, CFile::modeCreate | CFile::modeWrite);
long iTemp = 0;
while (1)
{
rcv = recv(s, buffer, 1024, 0);
if (rcv == 0)
{
break;
}
file.Write(buffer, rcv);
iTemp += rcv;
m_progress.ShowWindow(SW_SHOW);
m_progress.SetPos(iTemp);
}
file.Close();
if (iTemp != lFileSize)
{
AfxMessageBox("文件接收失败!");
}
m_cState.SetWindowText("文件接收成功!");
shutdown(s,SD_BOTH);
closesocket(s);
}
5、日志函数,显示在list中
void CBaGJSocketDlg::WriteLog(LPCTSTR LogText)
{
CString tmp;
CTime curTime=CTime::GetCurrentTime();
tmp=curTime.Format("%Y-%m-%d %H:%M:%S");
tmp=tmp+":"+LogText;
m_List.AddString(tmp);
}
这段代码也不是自有“产权”,也是根据一个Demo改写的
- 异步(非阻塞)模式的学习
- socket异步通信-非阻塞模式(异步非阻塞)
- 同步异步阻塞非阻塞 的学习
- 异步Socket(非阻塞模式)的应用
- 异步非阻塞开发模式的优越性
- IO模式——同步(阻塞、非阻塞)、异步
- IO的学习笔记 - 同步,异步,阻塞,非阻塞
- 同步异步和阻塞非阻塞模式
- Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
- 同步异步阻塞非阻塞Reactor模式和Proactor模式 (目前JAVA的NIO就属于同步非阻塞IO)
- 基于Socket的多线程和异步非阻塞模式编程
- 基于Socket的多线程和异步非阻塞模式编程
- 基于Socket的多线程和异步非阻塞模式编程
- 异步非阻塞模式调用接口(axis2)
- Windows Socket 异步编程(非阻塞模式)
- Windows Socket 异步编程(非阻塞模式)
- Nginx的异步非阻塞
- 同步 异步 阻塞 非阻塞的区别
- 关于C#静态构造方法的几点说明
- ORA-12541:oracle10g 卸载重装后 出现no listener错误的解决方案
- (震撼实拍)垃圾场里发奋学习的兄妹俩
- 面试时经常会被问到的的问题
- 我花了18年时间才能和你坐在一起喝咖啡 (转载)
- 异步(非阻塞)模式的学习
- 几种STL中常用的容器和类1
- Tomcat 5/6 GBK 编码下完美解决中文表单问题的过滤器
- Dom4j的使用(全而好的文章)
- 固定的背景
- 几种STL中常用的容器和类2
- 常用数据库JDBC连接写法
- VS2005快捷键一览
- 取當前日期各种數据庫的寫法-db2教程-电脑教程之家