C++网络编程学习笔记

1、IP网络中的每台主机都有一个IP地址;
它是逻辑地址;
因特网上的IP地址具有全球唯一性;
4个字节,192.168.0.16
2、OSI将网络分为 TCP/IP模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口
物理层
相同层次之间不可以直接通信,是虚拟通信。下层向上层提供服务,实际通信在最底层完成。各层之间单向依赖。
3、DNS是将DNS解析为IP地址。
应用层:Telnet、FTP、HTTP、DNS、SMTP、POP3。
传输层:TCP实现数据的完整性,例如下载安装包;UDP实现数据的及时性,例如网络视频电话。
4、数据封装:在数据前面加上特定的协议头部。
5、TCP和UDP可以使用同样的端口,1024以下的端口保留给预定义的服务。windows socket只支持AF_INET网际域.
6、在网络协议中需要指定网络字节顺序,TCP/IP使用16位整数和32位整数的高位先存格式,PC机采用的是低位先存格式。
套接字:流式套接字(基于TCP)、数据报套接字(基于UDP),原始套接字。
7、基于TCP的socket编程
服务器端程序:
创建套接字;
将套接字绑定到一个本地地址和端口上bind
将套接字设为监听模式,准备接受客户请求listen
等待客户请求,当请求到来,返回一个新的对应于此次连接的套接字accept
用返回的套接字和客户端进行通信send/recv。
返回,等待另一客户的请求。
关闭套接字。
客户端程序:
创建套接字;
向服务器发送连接请求connect
和服务器进行通信send/recv
关闭套接字。
8、基于UDP的socket编程
服务器端(接收端)程序:
创建套接字
绑定套接字到本地地址和端口上bind
等待接受数据recvfrom
关闭套接字
客户端(发送端)程序:
创建套接字
发送数据sendto
关闭套接字
9、Alt+F8实现代码的整齐。
10、0535code.com是回路地址。可以在同一台机子上通信。
11、将两个工程添加到一个工作区中,在工作区中点右键”添加工程”。取消”编译微型条”,选中”组建”.
12、基于TCP/IP的socket代码:

/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
//终止使用套接字DLL库
WSACleanup( );
return;
}

//1、创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
/*第一个参数对于TCP/IP协议的套接字,只能是AF_INET或PF_INET,第二个参数对于
1.1版本的socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字,
SOCK_DGRAM产生数据报套接字,第三个参数为零时自动选择合适的协议。*/

//2、绑定套接字到一个本地地址和端口上
SOCKADDR_IN addSrv;
//htonl是把u_long类型转换为网络字节序
//htons是把u_short类型转换为网络字节序
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
//unsigned   short   sin_port;
addSrv.sin_port=htons(4000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));

//3、将套接字设为监听模式,准备接受客户请求
listen(sockSrv,5);
SOCKADDR_IN addClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addClient,&len);
//accept函数第三个参数必须赋初始值,初始值为结构体的长度。否则函数调用失败



//4、用返回的套接字和客户端进行通信
char sendBuf[100];
sprintf(sendBuf,"hello,haha %s",inet_ntoa(addClient.sin_addr));
//inet_ntoa函数是将网络IP地址转换为字符串
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);

//4、关闭套接字
closesocket(sockConn);
}
}


/*Client.cpp*/
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

//1、创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

//2、向服务器发送连接请求
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("0535code.com");//设置SOCKET的IP为本机。
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4000);//端口为4000,服务端和客户端的端口一定要相同.否则是连不

上的
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端

//3、和服务器进行通信
char recvBuf[100];
recv(sockClient,recvBuf,100,0);//接收100字符
printf("%s\n",recvBuf);        //显示
send(sockClient,"hello",strlen("hello")+1,0);    //发送一个hello

//4、关闭套接字
closesocket(sockClient);            //关闭
WSACleanup();                        //清理
}

13、基于UDP/IP的socket代码:

/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
//终止使用套接字DLL库
WSACleanup( );
return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4001);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[50];
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);

closesocket(sockSrv);
WSACleanup();
}


/*Client.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )

编译原理

刚看C/C++群里有人问一个程序的输出结果,代码如下:

#include <iostream>
using namespace std;
void main()
{
int a=4 ;
a=(a++)+(++a)+(a--)+(--a);
cout<<a;
}

隐约的看了下,以为输出结果是20,用VC++编译了一下,结果却是19,然后其他编译器的结果也都不同。

JAVA?? :20
VC++?? :19
VS2005?:16

为什么会结果不同呢,这就设计到编译原理的问题了,每种编译器的编译原理各不相同,所以导致结果也不同。

 

手工查杀一个蠕虫病毒

昨天上网聊天,正在聊得好的时候,去软件盘里面找软件,怎么都变成快捷方式了,都不显示了,我没开杀软,这一定是病毒在搞的鬼了,把快捷方式删除掉,软件盘里面什么都没有了,删除的都是快捷方式,没事,文件肯定还藏在磁盘里面,用了下DOS命令,ATTRIB,没效果,还是不显示,于是我进PE看了下,看到里面的文件了,看到了每个磁盘里面都有两个文件,一个是AutoRun.inf,另一个是1066705994.vbs,第一个AutoRun.inf这个配置文件,是干嘛的呢,之前写了一篇文章里面写的修改U盘图标,就是用的这个文件夹,就是自动加载的意思,只要单击一下,就会触发他,先说下我之前因为看不到文件的原因吧,之前看不到文件的原因,那是因为这两个文件是受保护的系统文件属性,所以,在文件夹选项选择,显示所有文件夹(包括隐藏文件夹),然后显示系统文件夹也不显示,还有一个,就是隐藏操作系统受保护的文件,这里把对号去掉就可以看到我们的文件夹而不是快捷方式了。。。
看下AutoRun.inf里面的内容:
[AutoRun]
Shellexecute=WScript.exe 1066705994.vbs “AutoRun”
shell\open=HH(&O)
shell\open\command=WScript.exe 1066705994.vbs “AutoRun”
shell\open\Default=1
shell\explore=HHHHH(&X)
shell\explore\command=WScript.exe 1066705994.vbs “AutoRun”
这配置文件里面的意思就是自动加载 1066705994.vbs 这个脚本。。。 下面看下脚本的内容:
‘b”3X&&#&3ex’)!x3ax,(jr
‘_%);a/+Gr/$n$!((Un!0;a/+X^.!|0!j}&!~0C=/~m%ko%*bI”%g`/5/o!h+]&`~o=DUn!0;r/$n$!((X^.!|0!j}&!~0C=3n~m%,oInc!(g=DU^|((;h|%*CDkp
‘5WDa/CKPijon
‘Ihy?llilyL_mog_yH_rn4>cgy;lam&yPclomFi[^&yPclom;mm4M_ny;lam7QM]lcjn(;laog_hnm4PclomFi[^7A_nG[chPclom”+#4Pclom;mm7A_nG[chPclom”*#4;laHog7*4>iyQbcf_y;laHogy6y;lam(=iohn4J[l[g7J[l[g {y{ ;lam”;laHog#4;laHog7;laHogy%y+4Fiijqr
‘}@-z,=,8gvm,>0R|423?Rz,=,8VJ]SSmk
‘Zlslj{‘Jhzl’Z|iWhyhtip
‘@^pb|~ork~rk
‘u92s%8,`o)*8Kzv’6-48Qv’6-48i900q%1)OCUL]f%00Cu92Ku92s%8,L]f%00Cl2:%()v=78)1Ky-697o3%(Oy-697d77L]f%00Cu92KEHv=78)1u338H 7=78)1 7:’,378Q)<)CEIy-697o3%(Lln
‘|;M?Y[NRN[eY[FIA[e[CHC[Ye[CH@[np
‘*MF(9L@tY\+QKL=E*GGL\4KQKL=Eji4&’,|(x{e|0|WY](9J9Eqz9DDW*MF_*MF(9L@`qz9DDW!FN9<=+QKL=E_.AJMK$G9<c.AJMKxKK`qz9DDW*MF_Y\+QKL=E*GGL\4KQKL=E4KN;@GKLe=P=WY].AJMK$G9<`nn
‘.L^PjlML_lvjlNXOlpm
…………………..
都是一堆乱码,可惜了,需要解密,解密需要用两次execute函数来解密,解密就不说了吧。。。喜欢研究的人可以去研究下,这个话题主要讨论手工查杀这个蠕虫病毒。。。
这个病毒其实很垃圾的,没什么破坏性,只是会把所有盘的文件夹变成快捷方式而已,只要把隐藏操作系统受保护的文件那里的 对号去掉,就是不让他隐藏,显示出来,把这两个文件删除就可以了,注意,要全盘都删除,只要有一个盘没删除,就会感染所有盘,我的好像是U盘感染了,手工查杀蠕虫病毒就是这样了,这个是比较低级的病毒,我把病毒提取出来了,下载了360杀毒软件,查杀下,杀软不报毒,虽然这个对电脑没什么大的危害,但是也具有恶意性了,所有有些东西,也不能全靠杀毒软件,不是有句话说:伤人之心不能有,防人之心不能没有,换到个人电脑上就应该讲:不防病毒之心不能有(防病毒之心不能没有),不用杀软之心不可有,嘿嘿,好像绕口令,这个病毒就是让我这么给清理掉的。。。

 

VB菜鸟整人代码

在窗体的按钮一代码

Option Explicit
Private Sub Command1_Click()
Dim wood As String
MsgBox  "密码:我是猪", vbCritical,"网痴友情提示" '这里写捉弄人的话
wood = InputBox("请输入密码:")
If wood = "骂自己" Then '密码可以自己设
End
Else
Shell "cmd.exe /c shutdown -s -t 60" '60秒后关几
End If
End Sub

在窗体的按钮二代码

Private Sub Command2_Click()
Shell "cmd.exe /c shutdown -a"
MsgBox "不怎么好玩", vbExclamation,"不玩了"
End
End Sub

下面段代码是VBS,可以单独用,也可以嵌入网页用。。。

on error resume next
dim WSHshellA
set WSHshellA = wscript.createobject("wscript.shell")
WSHshellA.run "cmd.exe /c shutdown -r -t 120 -c "密码:我是猪 ",0 ,true
dim a
do while(a &lt;&gt; "我是猪")
a = inputbox ("说我是猪,就不关机,快点说""系统"" ","说不说","不说",8000,7000)
msgbox chr(13) + chr(13) + chr(13) + a,0,"MsgBox"
loop
msgbox chr(13) + chr(13) + chr(13) + "早说就行了嘛"
dim WSHshell
set WSHshell = wscript.createobject("wscript.shell")
WSHshell.run "cmd.exe /c shutdown -a",0 ,true
msgbox chr(13) + chr(13) + chr(13) + "哈哈,帮我踩下空间哈 - 文件来自QQ610358898"

网痴C排序算法

#include "stdio.h"
main()
{int a[11];
int i,j,t;
printf("请输入十个数字:\n");
for(i=1;i<11;i++)
{
scanf("%d",&a[i]);
printf("继续输入:\n");
}
for(j=1;j<11;j++)
for(i=1;i<10-j;i++)
if (a[i]>a[i+1] )
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("输出:\n");
for(i=1;i<11;i++)
printf("%d < ",a[i]);
}

修改的C排序算法,有时间好好整理一下C的各种排序和,链表。。。

Delphi记事本编程代码

新建文件:form1.memo1.lines.Clear; //清空MEMO1
打开文件:
form1.OpenDialog1.execute;
form1.Memo1.Lines.LoadFromFile(form1.OpenDialog1.filename);
保存文件:
form1.saveDialog1.execute;
form1.Memo1.Lines.savetoFile(form1.saveDialog1.filename);
退出:close; //关闭
编辑操作:
form1.Memo1.cuttoclipboard; //剪切
form1.Memo1.CopyToClipboard; //复制
form1.Memo1.PasteFromClipboard;// 粘贴
form1.Memo1.clearselection; //删除选中内容
字体相关设置:
memo1.Font.style:=memo1.Font.Style +[fsbold];//加粗
memo1.Font.style:=memo1.Font.Style +[fsitalic]; //加斜
memo1.Font.style:=memo1.Font.Style +[fsunderline]; //加下划线
fontdialog1.Execute;
memo1.Font:=fontdialog1.Font; //字体选择代码
memo1.font.color:=clred; //设置字体颜色为红色

初学Delphi一点笔记

初学Delphi一点笔记
F1?? 调用帮助MSDN
Inc(variadle,加量),Dec(variadle,减量)? 增减函数
Concat(str1,str2) 字符串连接函数
Dispose(指针)? 释放内存
Low(A)和High() 数组最小值和最大值
Result返回值
利用句柄可以防止程序运行多个实例
 
Delhpi基本控件
showmessage(‘显示消息函数’);
MainMeun 贴窗体导航菜单控件 – 绑定事件
PopupMenu 弹出菜单? – 绑定事件
颜色控件 form1.Color := ColorBox1.Selected;
 
Delphi 关键字(加粗显示)
Unit 单元 end. //单元部分代码
interface //单元内的过程,变量,函数等
uses //(系统级别单元)引用单元,Ctrl+单元名称(查看单元底层代码)
type //声明对象类型 TFrom1 = class(TForm) 窗口类 实例化
private //定义只供本单元使用的函数或者过程
public? //定义其他单元可引用的函数或者过程
implementation //已完成头部文件定义
 
Delphi常用快捷键
ctrl+shift+上/下方向键: 在声明与实现之间切换
ctrl+shift+数字键:设置标签
ctrl+数字键:转到标签
ctrl+y:删除该行
ctrl+z:恢复删除
F11:在对象与属性之间切换
F12:在界面与单元之间切换
 
数据类型
integer,Boolean,Double,TDateTime
function函数(有参数)和procedure过程(无参数)
ctrl+shift+c (跳到过程);
 
数组 循环赋值:
for i:= Low(array1) to High(array1) do
array1[i]:=i;
 
WebBrowser控件显示网页
WebBrowser1.Navigate(‘www.163.com’);
 
输入输出对话框函数应用
var str1,str2:string;
str2:=inputbox(‘提示标题’,’请输入参数’,str1);
showmessage(str2);

编译文件被感染,生成软件报毒,delphi朋友

大家检查下安装目录
lib下的SysConst.dcu文件,大小,如果为17KB,被感染了。我的是18K,目前5个杀毒,瑞星,卡巴,AVG等检测到了病毒
SysConst.dcu正式大小应该为12KB不到点点。lib/debug目录下有SysConst.dcu,SysConst.bak(改名回来)文件,替换回来就可以恢复正常!
我也不知道我是怎么感染的。
卡饭朋友的疑问
http://www.kpfans.com/bbs/thread-539760-1-1.html
http://www.unpack.cn/viewthread.php?tid=39339
基本都是8.16号后的问题。并非误报!
替换回正规SysConst.dcu问题解决了!大家查看下巴。免得自己写的东西被人说病毒
可能是某个控件带来的问题!
此文转载于:http://club.itqun.net/showtopic.aspx?forumid=48&forumpage=1&topicid=104490&go=next
卡饭论坛,杀毒太强大了,不是杀毒软件一个程序,月月也是一个病毒专家,太佩服了,病毒专家,真好,加油…

Delphi过程与函数异同

? ?过程和函数不同,函数必须有返回值,过程则没有。
可以采用变量参数的方式使过程也能返回处理过的值。
类TForm1的函数,必须采用ObjectName.functionName的方式调用(TForm1自身的函数或方法除外)。
单元Unit1的函数,可看作公共函数,只要其他单元引用了Unit1,就可以使用该函数 。

过程:

procedure Hello;
begin
ShowMessage ('Hello world!');
end;

调用:Hello;
函数:

function Double (Value: Integer) : Integer;
begin
Double := Value * 2;? //函数名做返回值
end;
function Double2 (Value: Integer) : Integer;
begin
Result := Value * 2; //Result作返回值
end;