是本科毕业的暑假做的,是我们现在做的实验室路由器仿真软件的一小小小小模块,但是是我第一次用VC做东西,也学到了很多东西,比如说第一次来做网络编程的东西,第一次做多线程的东西,虽然很小,但是通过动手,还是发现,哎,书上的东西和真正动手,差别太大了,而且发现自己动手能力是如此之差!!恼火!!
做的是一个SMTP协议来实现,目的是给网路不断的增加压力,发送SMTP数据包,并统计出来发送的数据量的大小,而且这个程序还有很多不完善的地方,不过是本人第一个小小小小项目,嘿嘿,还是把它贴出来吧。
PS:嘿嘿,肯定是要参考些东西的,所以在这里把那些参考资料也贴出来,如果是幸运的转载了某位牛人的帖子,请不要见怪,我也都是GOOGLE的
下面是我的代码:
上面是程序运行图,下面是些核心代码,关于上面涉及到的组件什么的就不写了。
/*================================线程函数==========================================*/
UINT MyEventThread(void *pstring)
{
CTestDlg *hWnd = (CTestDlg *)pstring;//自定义函数中获取系统指针;
//smtp协议格式的前几个重要的字节填充;
CString Serv = "EHLO"+hWnd->m_Server+"/r/n";
CString From = "MAIL FROM :<"+hWnd->m_From+">/r/n";
CString To = "RCPT TO :<"+hWnd->m_To+">/r/n";
CString Text = hWnd->m_Message+"/r/n/r/n./r/n";
//定义一个数组,来获取输入的格式字节;
char *MailMessage[]=
{
Serv.GetBuffer(1),
From.GetBuffer(1),
To.GetBuffer(1),
"DATA/r/n",
Text.GetBuffer(1),
"QUIT/r/n",
NULL
};
//winsock的初始化及链接函数;
WSADATA Wsa;
WSAStartup(0x0101,&Wsa);
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sin;
sin.sin_addr.s_addr=inet_addr(hWnd->m_Server);
sin.sin_family=AF_INET;
sin.sin_port=htons(25);
if(connect(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
MessageBox(NULL,"Error:can't connect to server","Error",MB_OK|MB_ICONERROR);//如果链接不起的话;
int iLength=0;
int iEnd=0;
char sBuff[255]="";
int iMsg=0;
while(MailMessage[iMsg])//发送smtp数据包;
{
iLength=recv(s,(LPSTR)sBuff+iEnd,sizeof(sBuff)-iEnd,0);
iEnd+=iLength;
sBuff[iEnd]='/0';
for(;;)//循环,不断的发送数据包以增加网络压力;
{
send(s,(LPSTR)MailMessage[iMsg],strlen(MailMessage[iMsg]),0);
iTotal=send(s,(LPSTR)MailMessage[iMsg],strlen(MailMessage[iMsg]),0);
hWnd->m_Len+=iTotal;//自定义的变量,以统计发送的数据包大小;
}
iMsg++;
}
closesocket(s);
WSACleanup();
return 0;
}
/*================================启动线程==========================================*/
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
AfxBeginThread(MyEventThread,(void *)this); //调用自己编写的线程函数;
}
/*================================停止线程==========================================*/
void CTestDlg::OnEventThread()
{
// TODO: Add your control notification handler code here
UpdateData(FALSE);//统计发送数据量;
iTotal=0;//重新初始化,以便重新启动线程以计数;
m_Len=0;
}