UNIX编程·卷一之第一章

本文将总结第一章相关知识点,并随时进行补充

1、 bzero & memset 的区别

bzero

bzero不是ANSI C函数,带有两个参数
void bzero(void *s, int n);无返回值
作用:将s字符串中前n个字节置为0,也可以称作清零。n通常用sizeof来计算。
Ex: bzero(&servaddr,sizeof(servaddr));

memset

memset带有三个参数
void *memset(void *s, int c, unsigned long n);无返回值
作用:将s字符串中前n个字节赋值为c,当c为0时,作用与bzero相同。n通常用sizeof来计算,但需注意,memset第二个参数为int类型,第三个参数其实是为size_t,通常定义为unsigned int类型。
Ex:memset(&servaddr,0,sizeof(servaddr));

2.TCP返回

当服务器向客户端返回数据时,假设为20个字节字符串,这20个字节返回方式可能为包含所有20个字节的单个TCP分节,也可能为每个分节只含1个字节的20个TCP分节,也可能是总共20个字节的TCP分节的各种组合。
当返回的数据量较大时,我们不能确保一次read调用能返回服务器的整个应答,所以我们总是把read编写在某个循环中,当read返回0(表明对端关闭连接)或者负值(表明发生错误)时终止循环。

3.TCP服务器

socket、bind和listen这3个调用步骤是任何TCP服务器准备所谓的监听描述符的正常步骤。
listen(listend,LISTENQ);
LISTENQ用来指定系统内核允许在这个监听描述符上排队的最大客户连接数。第四章将详细说明客户连接的排队。

通常情况下,服务器进程在accept调用中被投入睡眠,等待某个客户连接的到达并被内核接受。TCP三次握手完毕时accept返回,其返回值是一个成为已连接描述符的新描述符。该描述符用于与新近连接的那个客户通信。accpet为每个连接到本服务器的客户返回一个新描述符。

注:调用sprintf无法检查目的缓冲区是否溢出,而snprintf要求其第二个参数指定目的缓冲区的大小,因此可确保该缓冲区不溢出。

总结:第一章比较简单,大概介绍了TCP和UDP通信的实现方式,后续将重点说明。

猜你喜欢

转载自blog.csdn.net/weixin_37778713/article/details/105061420