Beej's Guide to Network Programming 学习笔记

本文介绍了Beej's Guide to Network Programming,一个全面的网络编程入门教程。主要内容包括TCP与UDP的区别、广播、地址复用、数据传输方式、安全注意事项等。特别强调了在不同平台间进行数据传输时的挑战,如机器字存储格式、浮点数与双精度存储格式、结构体字节对齐问题,以及如何在IPv4与IPv6环境下实现广播。此外,文章还提供了一些实用技巧和代码示例,帮助开发者更好地理解和应用网络编程知识。

Beej's Guide to Network Programming是一个网络编程的入门教程,感觉覆盖还算全面吧,至少对我这种小白来说。

本科网络实验老师给的参考资料,当时没看,现在补回来。

网络版的地址:http://beej.us/guide/bgnet/output/html/multipage/index.html

能找到的中文翻译严重过期,所以直接看英文。(囧,看了大量美剧后,本码农的英文总算是可以把这篇东西顺下来了)

以下是以前不知道的。

1.recv返回0

tcp,一端断开连接,另一端recv返回0,表示连接断开。(recv返回-1表示出错)

2.循环发送接收,包头要有长度信息

tcp,send想要发送的包的长度和返回成功发送的长度可能不一样。recv同样,发送端一次性发送的东西,接收端大概也不能保证一次收到。所以send和recv都要循环!所以包头一定要有长度信息!

3.select()很好用的样子


4.数据传输格式,可移植性,数据打包

  自己以前写东西的时候,都是直接打包数据为struct,发送端直接取struct指针,发送长度sizeof(struct),相同平台相同编译器配置当然没问题,如果跨平台的话就麻烦了。

  a.机器字的大端小端存储

  b.float,double的存储格式

  c.struct字节对齐导致填充字节可能不同

5.广播,UDP区别

IPv6,不支持广播,但是有一个叫做 multicasting的东西。

IPv4,只有UDP有广播。囧,这个当然,tcp是一对一连接,怎么广播呢。区别:

1.地址255.255.255.255或者(network_number | (~ netmask))(即地址中代表主机的位全置为1)

2.对socket调用如下代码

   // this call is what allows broadcast packets to be sent:
    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
        sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

6.Address already in use

调试的时候,这个挺烦的,如果不想等上一分钟,可以试着用如下代码

int yes=1;
//char yes='1'; // Solaris people use this

// lose the pesky "Address already in use" error message
if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
} 

7.AF_INET 和  PF_INET

Once upon a time, a long time ago, it was thought that maybe a address family (what the "AF" in "AF_INET"stands for) might support several protocols that were referred to bytheir protocol family (what the "PF" in "PF_INET" standsfor). That didn't happen. And they all lived happily ever after, TheEnd. So the most correct thing to do is to useAF_INETin yourstruct sockaddr_in and PF_INET inyour call tosocket().

8.write a server that accepts shell commandsfrom a client and executes them

注意安全

9.promiscuous mode

当网卡为此模式时,可以作为sniffer

10.书单+=

"The Practice ofProgramming" by Kernighan and Pike

W. Richard Stevens' UNIX Network Programming

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值