closehandle(hobject);
postquitmessage(0);
return 0;
}
/* 创建窗口 */
dvpwindow.style=0;//指定类的风格
dvpwindow.lpfnwndproc=(wndproc)mainwndproc;//窗口过程的远指针
dvpwindow.cbclsextra=0;//窗口结构额外字节数
dvpwindow.cbwndextra=0;//窗口实例额外字节数
dvpwindow.hinstance=hinstance;//窗口过程所在的实例
dvpwindow.hicon=loadicon(hinstance,makeintresource(main));//调用标识类的图标
dvpwindow.hcursor=loadcursor(null,idc_arrow);//调用标识类的光标
dvpwindow.hbrbackground=(hbrush)getstockobject(white_brush);//标识背景类的画刷
dvpwindow.lpszmenuname=null;//指向标识类菜单资源的字符串,以空字符结束
dvpwindow.lpszclassname="dvpsample";//标识本类的名称
registerclass(&dvpwindow);//注册窗口
hwndmain=createwindow("dvpsample",
"dvpsample",
ws_overlappedwindow,
cw_usedefault,cw_usedefault,
cw_usedefault,cw_usedefault,
null,null,hinstance,null);
if(!hwndmain) return 0;
showwindow(hwndmain,sw_hide);//显示窗口
updatewindow(hwndmain);//更新窗口
return 1;
}
//处理窗口消息
lresult callback mainwndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
{
switch(message)//开始处理消息
{
/* user interface message */
case wm_close:
return(defwindowproc(hwnd,message,wparam,lparam));
break;
case wm_destroy:
deletesystrayicon();
postquitmessage(0);
break;
case wm_size:
delallconninst();
break;
/* network message */
case um_async:
switch(wsagetselectevent(lparam))
{
case fd_accept:
onaccept((socket)wparam);
break;
case fd_read:
onread((socket)wparam);
break;
case fd_write:
onwrite((socket)wparam);
break;
case fd_close:
onclose((socket)wparam);
break;
}
break;
default:
return(defwindowproc(hwnd,message,wparam,lparam));//默认窗口过程的消息处理
}
return(0);
}
pconninst addconninst(socket socket, unsigned short port, struct in_addr ip)
{
/* 分配一块新的连接实例 */
pconninst newconninst=(pconninst)malloc(sizeof(conninst));
/* 没有内存了 */
if(newconninst==null) return null;
/* 分配一块新的sockaddr实例 */
// newconninst->sockaddr=(lpsockaddr)malloc(naddrlen);
// newconninst->sockaddr=malloc(naddrlen);
/* 没有内存了 */
// if(newconninst->lpsockaddr==null)
// {
// free(newconninst);
// return null;
// }
//装填新的请求包
newconninst->socket=socket;
newconninst->clientport=port;
newconninst->clientip=ip;
newconninst->pcmd=null;
newconninst->presult=null;
newconninst->cmdlen=0;
newconninst->resultlen=0;
newconninst->begintime=time(null);
newconninst->updatetime=newconninst->begintime;
newconninst->lastestsequencenumber=0;
newconninst->next=null;
//如果请求链表是空的
if(pconninsthead==null)
{
//将这个请求作为链表头,放到pconninsthead
pconninsthead=newconninst;
}
else
{
pconninst tempconn=pconninsthead;
//走到链表尾
while(tempconn->next) tempconn=tempconn->next;
//追加新包到链表尾
tempconn->next=newconninst;
}
//返回装填好的包的指针
return newconninst;
}
pconninst getconninst(socket socket)
{
/* 遍历链表,寻找套接口 */
pconninst tempconn=pconninsthead;
while(tempconn!=null)
{
if(tempconn->socket==socket) break;
tempconn=tempconn->next;
}
/*若没有,返回null */
return(tempconn);
}
void delconninst(pconninst pconninsttodel)
{
/* 如果要删除的是链表头 */
if(pconninsttodel==pconninsthead)
{
/* pconninsthead->next 成为头 */
pconninsthead=pconninsthead->next;
/* 对链表头的free()在最后进行 */
}
else
{
pconninst tempconn=pconninsthead;
/* 从链表头开始 到null为止 每次指向下一个*/
while(tempconn!=null)
{
/* 若当前的下一个是要被删除的 */
if (tempconn->next==pconninsttodel)
{
/* 当前的下一个变成下一个的(要被删除的)下一个 */
tempconn->next=pconninsttodel->next;
break;
}
}
}
/* 释放pconninsttodel占用的内存 */
free(pconninsttodel->pcmd);
free(pconninsttodel->presult);
free(pconninsttodel);
return;
}
void delallconninst(void)
{
pconninst tempconn=pconninsthead;
pconninst tempconn2;
/* 遍历链表,依次释放内存 */
/* 若存在tempconn则继续for */
while(tempconn!=null)
{
tempconn2=tempconn->next;
// free(tempconn->lpsockaddr);
// free(tempconn->presultbuf);
free(tempconn->pcmd);
free(tempconn->presult);
free(tempconn);
tempconn=tempconn2;
}
pconninsthead=null;
return;
}
void onaccept(socket socket)
{
sockaddr_in sockaddrin;
pconninst conninst=null;
socket peersocket;
int templength;
// accept the new socket descriptor
templength=sizeof(sockaddr_in);
peersocket=accept(listensocket, (struct sockaddr far *)&sockaddrin, (int far*)&templength);
if(peersocket==socket_error)
{
if(wsagetlasterror()!=wsaewouldblock)
{
//("error! accept error. the request form %s can't be accepted.",inet_ntoa(sockaddrin.sin_addr));
return;
}
}
//让它也可以在读写或关闭的时候向窗口发送消息
wsaasyncselect(peersocket, hwndmain, um_async, fd_read | fd_write | fd_close);