作者归档:℃冻番茄

linux socket 编程 

1. socket()

2. bind()

3. connect()

4. listen()

5. accept()

6. send()和recv()

7. sendto()和recvfrom()

8. close()和shutdown()

9. getpeername()

10. gethostname()

socket()

————————————————

    我们使用系统调用socket()来获得文件描述符:

    #include <sys/types.h>

    #include <sys/socket.h>

    int socket(int domain, int type, int protocol);

    第一个参数domain设置为“AF_INET”。

    第二个参数是套接口的类型SOCK_STREAM或SOCK_DGRAM。

    第三个参数设置为0。

    系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。

bind() — 服务器端socket绑定本地IP和端口

————————————————

    一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只想使用connect()则无此必要。

    下面是系统调用bind()的使用方法:

    #include <sys/types.h>

    #include <sys/socket.h>

    int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

    第一个参数sockfd是由socket()调用返回的套接口文件描述符。

    第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。

    第三个参数addrlen可以设置成sizeof(structsockaddr)。

    下面是一个例子:

    #include <string.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #define MYPORT 3490

    int main()

    {

        int sockfd;

        struct sockaddr_in my_addr;

        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        my_addr.sin_family      = AF_INET;

        my_addr.sin_port        = htons(MYPORT);

        my_addr.sin_addr.s_addr = inet_addr("132.241.5.10");

        bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

    如果出错,bind()也返回-1。

    如果你使用connect()系统调用,那么你不必知道你使用的端口号。当你调用connect()时,它检查套接口是否已经绑定,如果没有,它将会分配一个空闲的端口。

注:

    bind()所做的事情其实就是: 将该socket和本地的IP地址和某个端口号相关联 — 将sockaddr与socket绑定

设置inet_sock结构的下列域

    inet->rcv_saddr   132.241.5.10   本地接收地址

    inet->saddr       132.241.5.10   本地发送地址

    inet->sport       3490           本地端口

    inet->daddr       0              目的地址(远程地址)

    inet->dport       0              目的端口(远程端口)

connect() — 客户端socket连接服务器端的socket

————————————————

    系统调用connect()的用法如下:

    #include <sys/types.h>

    #include <sys/socket.h>

    int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);

    第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。   

    第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。

    第三个参数可以使用sizeof(struct sockaddr)而获得。

    #include <string.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #define DEST_IP    "132.241.5.10"

    #define DEST_PORT 23

    int main() {

        int    sockfd;

        struct sockaddr_in dest_addr;

        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        dest_addr.sin_family      = AF_INET;

        dest_addr.sin_port        = htons(DEST_PORT);

        dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);

        connect(sockfd, (structsockaddr*)&dest_addr, sizeof(struct sockaddr));

    同样,如果出错,connect()将会返回-1。

listen()

————————————————

    如果你希望不连接到远程的主机,也就是说你希望等待一个进入的连接请求,然后再处理它们。这样,你通过首先调用listen(),然后再调用accept()来实现。

    系统调用listen()的形式如下:

    intl isten(int sockfd, int backlog);

    第一个参数是系统调用socket()返回的套接口文件描述符。

    第二个参数是进入队列中允许的连接的个数。进入的连接请求在使用系统调用accept()应答之前要在进入队列中等待。这个值是队列中最多可以拥有的请求的个数。大多数系统的缺省设置为20。你可以设置为5或者10。当出错时,listen()将会返回-1值。

    当然,在使用系统调用listen()之前,我们需要调用bind()绑定到需要的端口,否则系统内核将会让我们监听一个随机的端口。所以,如果你希望监听一个端口,下面是应该使用的系统调用的顺序:

    socket();

    bind();

    listen();

accept()

————————————————

    系统调用accept()比较起来有点复杂。在远程的主机可能试图使用connect()连接你使用listen()正在监听的端口。但此连接将会在队列中等待,直到使用accept()处理它。调用accept()之后,将会返回一个全新的套接口文件描述符来处理这个单个的连接。这样,对于同一个连接来说,你就有了两个文件描述符。原先的一个文件描述符正在监听你指定的端口,新的文件描述符可以用来调用send()和recv()。

    #include <sys/socket.h>

    int accept(int sockfd, void *addr, int *addrlen);

    第一个参数是正在监听端口的套接口文件描述符。第二个参数addr是指向本地的数据结构sockaddr_in的指针。调用connect()中的信息将存储在这里。通过它你可以了解哪个主机在哪个端口呼叫你。第三个参数同样可以使用sizeof(struct sockaddr_in)来获得。

    如果出错,accept()也将返回-1。

    #include <string.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #define MYPORT   3490

    #define BACKLOG 10

    int main() {

        int    sockfd, new_fd;

        struct sockaddr_in my_addr;

        struct sockaddr_in their_addr;

        int    sin_size;

        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        my_addr.sin_family      = AF_INET;

        my_addr.sin_port        = htons(MYPORT);

        my_addr.sin_addr.s_addr = INADDR_ANY;

        bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

        listen(sockfd, BACKLOG);

        sin_size = sizeof(struct sockaddr_in);

        new_fd   = accept(sockfd, &their_addr, &sin_size);

         …

    下面,我们将可以使用新创建的套接口文件描述符new_fd来调用send()和recv()。

send()和recv()

————————————————

    系统调用send()的用法如下:

    int send(int sockfd, const void* msg, int len, int flags);

    第一个参数是你希望给发送数据的套接口文件描述符。它可以是你通过socket()系统调用返回的,也可以是通过accept()系统调用得到的。

    第二个参数是指向你希望发送的数据的指针。

    第三个参数是数据的字节长度。

    第四个参数标志设置为0。

    下面是一个简单的例子:

    char *msg = "Beejwashere!";

    int len, bytes_sent;

    …

    len        = strlen(msg);

    bytes_sent = send(sockfd, msg, len, 0);

    …

    系统调用send()返回实际发送的字节数,这可能比你实际想要发送的字节数少。如果返回的字节数比要发送的字节数少,你在以后必须发送剩下的数据。当send()出错时,将返回-1。

    系统调用recv()的使用方法和send()类似:

    int recv(int sockfd, void* buf, int len, unsigned int flags);

    第一个参数是要读取的套接口文件描述符。

    第二个参数是保存读入信息的地址。

    第三个参数是缓冲区的最大长度。第四个参数设置为0。

    系统调用recv()返回实际读取到缓冲区的字节数,如果出错则返回-1。

    这样使用上面的系统调用,你可以通过数据流套接口来发送和接受信息。

sendto()和recvfrom()

————————————————

    因为数据报套接口并不连接到远程的主机上,所以在发送数据包之前,我们必须首先给出目的地址,请看:

    int sendto(int          sockfd, const void            * msg, int len,

               unsigned int flags, const struct sockaddr *to,   int tolen);

    除了两个参数以外,其他的参数和系统调用send()时相同。参数to是指向包含目的IP地址和端口号的数据结构sockaddr的指针。参数tolen可以设置为sizeof(structsockaddr)。

    系统调用sendto()返回实际发送的字节数,如果出错则返回-1。

    系统调用recvfrom()的使用方法也和recv()的十分近似:

    int recvfrom(int          sockfd, void            * buf, int len,

                 unsigned int flags, struct sockaddr * from, int * fromlen);

    参数from是指向本地计算机中包含源IP地址和端口号的数据结构sockaddr的指针。参数fromlen设置为sizeof(struct sockaddr)。系统调用recvfrom()返回接收到的字节数,如果出错则返回-1。

close()和shutdown()

————————————————

    你可以使用close()调用关闭连接的套接口文件描述符:

    close(sockfd);

    这样就不能再对此套接口做任何的读写操作了。

    使用系统调用shutdown(),可有更多的控制权。它允许你在某一个方向切断通信,或者切断双方的通信:

    int shutdown(int sockfd,int how);

    第一个参数是你希望切断通信的套接口文件描述符。第二个参数how值如下:

    0 —- Further receives are disallowed

    1 —- Further sends are disallowed

    2 -— Further sends and receives are disallowed(likeclose())

    shutdown()如果成功则返回0,如果失败则返回-1。

getpeername()

————————————————

    这个系统的调用十分简单。它将告诉你是谁在连接的另一端:

    #include <sys/socket.h>

    int getpeername(int sockfd, struct sockaddr* addr,int* addrlen);

    第一个参数是连接的数据流套接口文件描述符。

    第二个参数是指向包含另一端的信息的数据结构sockaddr的指针。

    第三个参数可以设置为sizeof(struct sockaddr)。

    如果出错,系统调用将返回-1。

    一旦你获得了它们的地址,你可以使用inet_ntoa()或者gethostbyaddr()来得到更多的信息。

gethostname()

————————————————

    系统调用gethostname()比系统调用getpeername()还简单。它返回程序正在运行的计算机的名字。系统调用gethostbyname()可以使用这个名字来决定你的机器的IP地址。

下面是一个例子:

    #include <unistd.h>

    int gethostname(char *hostname, size_t size);

    如果成功,gethostname将返回0。如果失败,它将返回-1。

最近在看一个c++教程,换了另一个G++ IDE 支持 wxWidgets

第2学堂的白话C++

网址:http://www.d2school.com/

以前在博客里说的一样,因为本人不喜欢ms的东西,本来打算学c#做第二语言的,但无奈还没有完全脱离windows环境(没问题,要聊qq,要看迅雷看看,还要玩玩魔兽,CS,还真不好全部转linux下),但又想学一门可以跨系统的桌面编程,以后还能顺便写写手机程序,后来还是觉得还是c++比较适合我,java要装虚拟机,运行速度太慢

然后c++ IDE选择,当然首先G++编译器,前段时间在博客里推荐了Dev-C++,但后来用过段时间发现,它已经不更新了,而且老是出错,后来就又找了一个Code::Blocks 多个版本,包括windows linux unix等。然后又找到了一份教程,文字很通俗易懂《白话C++》

附一个CodeBlocks的汉化包

codeblocks_chs.rar

CodeBlocks官方网站 http://www.codeblocks.org/

c++新手推荐开发工具Dev C++

最近在学习C++,以前在linux下用G++学过一段时间的c++,觉得非常好用,但现在在windows下,不能直接用G++了,本来打算用VC++ 6.0,可是找了半天,英文原版的都不下400m,郁闷了,而且vc++功能太大,也不怎么符合C++标准,本来学c++也不是为了做大项目,纯粹是好玩,没必要弄个那么大的家伙,后来在网上搜索找到了Dev c++ 用的是GCC的编译器, 这样以后写的小东西也可以直接扔到linux下的GCC进行编译了,方便多了!

下载地址:

http://www.skycn.com/soft/4639.html

Dev-C++是一个Windows下的C和C++程序的集成开发环境。它使用MingW32/GCC编译器,遵循C/C++标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的调试功能,能够适合初学者与编程高手的不同需求,是学习C或C++的首选开发工具!多国语言版中包含简繁体中文语言界面及技巧提示,还有英语、俄语、法语、德语、意大利语等二十多个国家和地区语言提供选择。

实际上目前的DEV CPP 的应用并非如VC一样广泛 但它是目前信息学竞赛使用的C语言编译器 (gcc)关于专门学习DEV CPP的书籍基本没有 大部分信息学竞赛书籍都是《数据结构》与《算法》并没有明确指定使用的编译器 而在竞赛中DEV CPP 被广泛应用 (可以在LINUX环境下使用)

 

未命名.jpg

狂笑!上班的时候看到笑出呻吟–

上大学的时候去衡山玩,当时爬山爬了一半,累的正想歇会的时候看到路边有个买纪念品的欧巴桑,上去开口就问:老婆……..
2.偶有次开车,有个美女同事搭车,一坐我旁边,偶特紧张滴说:把安全套带上!美女以后再不理偶了。郁闷ING

3.以前别人来我阿姨家作客,刚进门的。刚好我阿姨要去上厕所。她连忙招呼客人说:“你们坐哈坐哈,我给你们去倒点尿喝!”,,本来是说倒点茶喝的,,。

4.在实习的时候,对一个老师说:陈老师你是不是姓陈?

5.偶们大学去工厂金工实习的时候,工人师傅分配机床时说:为了安全起见,我门尽量保证一个男同学和一个女同学一张床。当时所有男生爆笑,女生脸红。实习期间,几乎所有的用车床的活都是我帮和偶同床,,寒,,的女生做的,最后考虑到她什么都不会作的话师傅检查起来不太好,偶劝她练练手,谁知道她说:我已经习惯让你干了。当时偶爆寒不止。

6.一个朋友去饺子馆,问“水饺(睡觉,,一碗,,晚,,多少钱?”只听服务员小姐“呸!”了一声,说道:“不要脸!”~

7.上自习的时候,大家都在看复习,GG对MM 说:“我刚背了单词,帮忙默写一下。”MM 不想默,GG就求她,你,,摸,,默我吧,,,摸,,我吧!结果MM 实在忍受不了,大喊,老师你看我不想,,摸,,默他,他非要我,,摸,,默~!

8.有一天去同学家吃饭,喝了点酒,她爸爸忽然进来了,本来是想喊叔叔的,结果说错了,说:“爸,来座!”~寒!大帮同学笑得要死

9.我同事跟人争执,急了张口来了句“你以为我吃饭长大的啊?”我一直纳闷他到底吃什么长大的。

10.小学时一个很讨厌的男生找我借橡皮,我不借,他就死缠烂打,之后我用尽全身的力气狂吼了一句“我不嫁,,借,,给你”当时同学们立马安静下来了,。

11.上机课,一位同学机子有问题,于是大喊“老板,换机子!”全班木然

12.我唾你一脸狗屎!

13.偶对mm开玩笑说:“别说你认识偶,影响我声誉!”mm说:“你有生育?你能生育?”..

14.偶是男的,在广东生病了嗓子说不出话…………去看医生,医生告诉我:yin dao发炎狂晕中…………仔细一看,诊断书上写者   咽道发炎 ………………无语…………….

15.买电脑,老板开价4150,我杀价:老板410么好赖~~~~老板狂晕!

16.上次早上上班,发现自行车轮胎没气了,于是想叫妈妈帮忙推到门外打一下气。结果我说:把我的轮胎推出去。

17.一个女孩失恋了,我劝她:“两条腿的蛤蟆不好找,三条腿的男的有的是!”

18.小学时候有劳动课,一般都是除草,所以到了前一天放学时候老师就得提醒我们带锄头,第2天上劳动课了准备出发,老师便于管理就问了一句:有多少人带了啊?带了手的把锄头举起来!”

19.开导一失恋。同学你知道什么叫失恋么?

20.初中语文课上,有人背诵毛泽东的诗:一代风骚,……

21.某老师, 今天,我们来上,杨修之屎

22.一次ktv,点歌,一mm大声喊:给我点一首周截棍的“双杰伦”……

23.大二有一阵儿特别喜欢和同宿舍的一个MM一起骑车出去逛街,收拾打扮漂亮后一起进了电梯,突然想起车好像没气儿了,就冲她说了句:先陪我去打胎啊?~天…….

24.公交车上人比较多,一猛男怒吼:妈个脚的踩我B上了

25.同学的高中同学,,一男生,,走进面馆很酷把头发一甩:“老板,2两葱不要米线!”完了还加一句:“多下点米线啊!”老板:“。你到底是要米线还是要葱?”

26.一次文艺晚会,主持人上台报幕:下面请欣赏:新疆歌舞,掀起你的头盖骨!毛骨悚然!

27.上高中时,课堂纪律混乱,老师一怒之下揪起XXX,说:XXX,你给我站墙上去!~全班暴寒!

28.我:那是我们物理老师。

同学:教什么的阿?

我:化学。

29.在网吧,一同学突然举手,大喊:“老师!”

30.我们宿舍一个人喝多了要去尿尿然后带出一句冷话:尿喝多了,酒就特别多.

31.买橘子,老板:一块五一斤。我:太贵了,五块钱三斤吧。老板:不行不行。

32.朋友问我电脑配置,我说显示器是彩屏的。,,本来是想说液晶的,,

33.听过一MM在食堂喊“给我一碗viper~!”

34.有一次寝室里同学的老妈打电话过来

我习惯说“他不在”,但是这一次我想说的的是“已经出去了”

结果说出来是:“他已经…不在了”

35.和我姐姐去李宁买鞋,我姐一开口:“小姐,这鞋多少钱一斤?”

36.高中时每人发个胸牌。一次来检查前,班主任跑到教室大声喊,大家快把胸罩戴起来,来查拉。 全场鸦雀无声。

37.老师留下作业,我不会做就抄别人的,然后去办公室交作业,看见老师说:“我抄完了!”

38.偶高中,放学和偶MM一起回家,校门口看到一卖烧烤的,MM说要吃牛杂,因为烤架前人比较多,偶怕老板听不见,于是偶大声喊道:“老板,5串牛鞭” 然后一片寂静,三秒钟后所有人一起暴笑。偶巨尴尬。最尴尬的是MM接着问偶“牛鞭是什么”偶只好非常非常小声地回答MM:“牛鞭就是牛尾巴啊”。

39.早上和同学去吃早餐 其中一个只吃包子馅,另外一个只吃皮。我们正在说他们两个浪费的时候吃馅的同学来了一句“行了 以后你吃我的包皮好了”在场的所有喝粥 的全部喷出来了。

40.大学军训时,教官大吼一声说:用你们的旁光,,余光,,对齐~偶们想笑又不敢笑,那个难过

国内一优秀免费防火墙今天发布了新版(离上一版有一年多时间)

『风云防火墙个人版 2009』

官方网站:

http://www.218.cc/

 

以前电脑的安全软件是

免费的风云防火墙1.27 + 免费的小红伞v8

正好小红伞昨天完成版本的更新v9 今天风云防火墙经过一年多的测试也发布了2009正式版

电脑现在的安全软件是

免费的风云防火墙2009+ 免费的小红伞v9

二款相互配合,非常好用,同时两款软件也非常的节省资源 让电脑处于全面保护状态

vps基本处于闲置状态,所以卖几份空间(只适合小流量网站或blog)

操作系统:ubuntu 8.04 (linux)

基本环境:Nginx 0.6.34    php 5.2.4   mysql 5.0.51   vsftpd  phpmyadmin

注意:空间只支持php+mysql网站,不支持asp及.net   web服务器采用的是高负载的nginx

可以上传zip文件,然后通知本人进行解压

从配置上大家就可以看到本人并不是专做虚拟主机业务的,只是出售点自己服务器上的空间而以,所以空间绝对的稳定,目前从租用到现在服务器没有启重过,服务器有2个固定ip地址!

php探针:http://www.ye55.com/php.php   (可以看到基本配置)

演示地址:http://www.phpd.cn   (私人博客)

大家可以测试速度!

现主机上只放置了我自己的博客,一个我工作室的主页,再加上一个企业站,为了不浪费资源,同时回收点租用费,所以出售10份空间

每份空间暂定200m但本在并没有在服务器上做磁盘配额,只要不占用非常大的流量,空间大小我可以说不限!

手工开通空间

所以拍下空间后请及时联系掌柜为您开通空间 ftp 及mysql账号!

注意事项:

1,不允许放置下载,在线播放等大流量耗资源性网站!

2,不允许放置违反中国和美国法律的网站!

3,不允许放置反动违反版权的内容!

为了大家的ip不至于被大陆屏蔽,所以发现有非法或反动信息将会告之,三次还违反规定的话,本人有权关闭网站!

点击进入淘宝进行购买

小红伞免费版9.0版本正式发布

前天刚在blog里发布小红伞晓月汉化v8免费版的信息,今天一大早就发布v9正式版出了来,小兴奋了一把,下载后换掉了v8,还在试用中。

Avira AntiVir 个人版- Free版,P版(Premium)和S版(Premium Suit)的所拥有的改进如下:
隔离区管理:列数减少
隔离区管理:可以使用HTTP上报文件
系统托盘工具:鼠标悬停时显示各个监控的状态
最后系统扫描:可在设定中独立配置警告信息
在设定面板中将“Win32 Heuristic”重命名为“AHeAD”
支持上网本(屏幕分辨率)
设定面板:新增按钮“Default Values(默认值)” 。这个按钮可以让您的配置恢复到预先确定的默认值
所有产品的安装文件夹路径和注册表项都改为“C:\Program Files\Avira\AntiVir Desktop”和“HKLM\Software\Avira\AntiVir Desktop”.现在个人版的各个版本不再有任何区别(指文件夹和注册表路径)
新增安装后的配置向导
GUI进程的保护
文件和文件夹保护
Avira键值的注册表保护
扫描锁定的档案
扫描器:手动扫描后对病毒检出结果的综合显示和一键清除。这个选项可以设置在扫描仪的配置
扫描器:改进后的清毒系统
扫描器:多核机器上的优化扫描
监控:更少内存占用
计划任务:现在可以在一个星期的多天内启动计划任务
计划任务:手动启动和停止任务
Avira AntiVir Personal – Free Antivirus独有改进如下:
增加对广告和间谍程序的检测查杀

小红伞v9 免费版官方站

http://www.free-av.com/