在Linux环境下进行C语言编程,特别是涉及到网络编程时,我们需要理解和掌握一些关键概念和技术。以下是一些相关的知识点:
1. **字符串与数组的区别**:
- `sizeof(str)` 在这里返回的是指针的大小,即32位系统下4个字节。`str`是一个指向字符数组的指针,它并不包含字符串的长度信息。
- `strlen(str)` 返回的是字符串的实际长度,不包括结束符`\0`。
- `sizeof(a)` 返回的是字符数组`a`的总字节数,包括存储的字符串和结束符`\0`,因此对于"123456789",它是10个字符加上一个结束符,共10个字节。
2. **内存管理**:
- 错误的`delete`函数会导致悬挂指针,因为释放`head`后,`head->link`变为无效。正确的做法是在释放`head`前保存其下一个节点的指针,然后更新`head`。
- 改正后的代码:
```c
int delete(node *head) {
node *temp = head->link;
free(head);
head = temp;
return 0;
}
```
3. **预处理器与const的区别**:
- `#define MAX_NUM 10` 是预处理器宏,进行文本替换,没有类型概念,在编译时完成。
- `const int MAX_NUM=10` 是一个const常量,具有类型,不能被修改,编译器会将其当作普通变量对待,但不允许赋值。
4. **网络编程基础**:
- **TCP连接的阻塞问题**:`connect()`可能会阻塞直到连接建立成功。可以通过设置非阻塞模式或使用超时来避免长时间等待,例如使用`select()`、`poll()`或`epoll()`等I/O多路复用技术。
- **客户端断线检测**:当客户端突然断线或重启,服务器通常通过检测TCP连接的状态变化(如超时或接收到RST报文)来得知。不同的TCP/IP实现可能有不同的处理方式。
- **子网掩码与可用IP地址**:
- `/30`表示子网掩码中的30位用于网络标识,剩余2位用于主机标识。对于210.27.48.21/30,有效的IP地址是210.27.48.21、210.27.48.22。一般而言,第一和最后一个地址分别作为网络地址和广播地址,不分配给主机使用。但根据上下文,可能还需要考虑多播地址的含义。
5. **TTL(Time To Live)**:
- TTL字段是IP数据包中的一个重要部分,它限制了数据包在网络中的最大生存时间或跳数。
- 主要作用是防止数据包在网络中无限循环,浪费网络资源。
- 工具应用:
- `ping`:发送的ICMP Echo请求中包含了TTL,通过响应的TTL减少来估计路径上的跃点数。
- `traceroute`:依赖TTL来跟踪数据包从源到目的地经过的路由器,每次经过一个路由器TTL减1,当TTL为0时,路由器会发送ICMP超时消息。
- `ifconfig`和`netstat -rn`通常不会直接使用TTL,但它们显示的信息可能与TTL有关,例如查看或配置网络接口的TTL值。
这些知识点是网络编程面试中常见的问题,理解和掌握它们对于从事软件开发,尤其是网络相关领域的工作至关重要。在实际工作中,还需要深入学习套接字编程、错误处理、并发处理、协议细节等方面的知识,以便构建高效、可靠的网络应用程序。