之前学了一些网络编程的东西,但还没有系统看过相关书籍,故先选了这本书来读,并记下一些阅读过程中觉得值得记录的东西,作为回顾之用。这里的记录只有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));
//地址转化为字符串