之前学了一些网络编程的东西,但还没有系统看过相关书籍,故先选了这本书来读,并记下一些阅读过程中觉得值得记录的东西,作为回顾之用。这里的记录只有Linux下的相关知识,没有Windows的相关操作。
第一章 理解网络编程和套接字
接电话套接字:套接字编程就像电话机。首先要安装电话机(socket函数),接着要给电话机分配号码(bind函数),还要给电话机接上电话线(listen),如果电话响了就可以接听电话了(accept函数)
第二章 套接字类型与协议设置
int socket(int domain, int type, int protocol)
1. domain:协议簇,常用的就是PF_INET(IPV4互联网协议簇)
2. type(数据传输方式):
1. SOCK_STREAM :面向连接的套接字
2. SOCK_DGRAM:面向消息的套接字
3. protocol(协议的最终选择):如果前面两个参数已经确定好了协议,则最后一个参数传递0即可。
TCP套接字和UDP套接字不会共用端口号,所以允许重复。
第三章 地址簇与数据序列

uint16_t, in_addr等都是POSIX(可移植操作系统接口)定义的数据类型,好处是可扩展,不管到了哪里uint16_t都是两个字节的无符号数。
sin_port和sin_addr都是以网络字节序保存
sin_zero的目的是为了让sockaddr_in和结构体sockaddr保持一致而插入的成员,必须填充为0。

对于网络中数据的传输,在传输前会自动将数据转化为网络字节序,接收的数据也会自动转化为主机字节序,不需要程序员手动转化。
in_addr_t inet_addr(const char * string):将字符串信息转化为网络字节序的整数型,如果返回值等于INADDR_NONE,则出错(1.2.3.256则会出错)
int inet_iton(const char * string, struct in_addr * addr),成功返回1,失败返回0,string转化之后的值存放在addr中。
char * inet_ntoa(struct in_addr adr):将网络字节序转化为字符串形式。

这里的memset是为了让sin_zero初始化为0。
在监听服务器上所有IP地址时,可以使用INADDR_ANY。

#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char * argv[]) {
char * ip = "127.12.11.11";
char * port = "4000";
struct sockaddr_in addr;
//这是必须的,因为最后的8位为0
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
//字符串转换为地址的第一种方法
inet_aton(ip, &addr.sin_addr);
//第二种方法:addr.sin_addr.s_addr = inet_addr(ip);
//字符串转化为整数再转化为网络字节序
addr.sin_port = htons(atoi(port));
//地址转化为字符串

本书详细介绍了TCP/IP网络编程,包括套接字类型、协议设置、地址簇、TCP和UDP服务器/客户端实现、优雅断开连接、域名解析、套接字选项、多进程通信、IO复用等内容。通过实例讲解了网络编程的关键概念和技术,适合进阶学习。
2925

被折叠的 条评论
为什么被折叠?



