TCP/IP Socket 编程读书笔记

本文深入探讨了IPv6地址结构及表示方法,并对比了TCP/IP中的流套接字与数据包套接字。进一步解析了SOCKETS API中地址和端口的网络字节顺序,以及大小端判断方法。同时介绍了消息分帧的两种常见技术:基于定界符和显示长度。此外,解释了可重入函数与线程安全函数的概念,并讨论了C++可变参数实现方法。最后,阐述了处理套接字阻塞的三种方法:非阻塞套接字、异步I/O和超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5/27: 

 1、IPv6地址有128位,共16字节。两个字节一组并用冒号隔开的十六进制数字组合。如:

2000:fdb8:8000:0000:0000:0001:00ab:853c:39a1,可以省略前导零,因此第5组和第6组可以只呈现1:ab,另外只包含0的一个组序列可以完全省略。上述可以改写为:2000:fdb8:8000::0001:00ab:853c:39a1

2、TCP/IP中主要类型的套接字是流套接字(stream socket)和数据包套接字(datagram socket),前者使用TCP,后者使用UDP。

3、Sockets API中,地址和端口总是使用网络字节顺序。网络字节顺序即是大端对齐,高序字节存储在起始地址,基于X86的主机一般采用小端对齐方式,即低序字节存储在起始地址。常用的转换函数有:htons() 与 ntohs(), 前者实现本机字节顺序与网络字节顺序的转换,后者相反。

判断大小端的方法:(union和指针操作)

#include<iostream>
using namespace std;
union s
{
       int i;
       char a;
};
int main()
{
   s my;
   int t=0x12345678;
   char *p=(char *)&t;
   printf("%x\n",*p);
  printf("%x\n",*(p+1));
  printf("%x\n",*(p+2));
  printf("%x\n",*(p+3));
   my.i=1;
   if(my.a)
     cout<<"little"<<endl;
   else
     cout<<"big"<<endl;
       return 0;      
}
4、两种常规的技术可以让接收者明确地查找消息得末尾:

1、基于定界符:

    通过唯一标记指示消息得末尾,特别是发送者紧接在数据后面传输的协商好的字节或字节序列

2、显示长度:

    在长度可变的字段或消息前附加一个长度字段,指出它所包含多少个字节。长度字段一般具有固定的大小,这会限制可以成帧的消息的最大大小。

5、可重入函数:指对于相同的(并且合法的)函数参数(包括无参函数的情况),多次调用此函数产生的行为是可预期的,即函数的行为一致,或者结果相同。不能保证这一点的函数称为不可重入(non-reentrant)函数。

   线程安全函数:多个线程调用不会发生资源冲突

  两者的关系是:可重入函数一定是线程安全的,线程安全的既可以是可重入,也可能不是重入的。

Strtok() 函数采用了静态变量存储处理字符串的中间状态,所以不是线程安全的函数,她的改进函数strtok_r() 函数则

6、C++可变参数实现方法:在带有可变参数的函数体中如何持有可变参数,一般通过指针访问,循环移动指针获得下一个参数。

7、处理套接字阻塞的三种方法:

 a:非阻塞套接字:将套接字设置成非阻塞状态

 b:异步I/O:当套接字上发生某个与I/O相关的事情时,把SIGIO信道递送给进程。

 c:超时:通过设置计时器,调用unsigned intalarm(unsigned int secs),计时器若发生超时,则产生SIGALRM信号,主进程捕捉此信号并处理即可。

8、每次创建一个进程时,操作系统都必须复制父进程的全部状态,包括:内存、栈、文件/套接字描述符等。线程通过允许在同一个进程内进行多任务处理而减少了这种代价:新创建的线程只是简单地共享与父进程相同的地址空间(代码和数据),而无需复制父进程的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值