TCPIP 网络编程-01-入门

带着问题看世界:

  1. 套接字在网络编程中的作用是什么?为何称为套接字
  2. 比较说明 listen 函数和 accept 函数的作用
  3. 创建套接字后一般会为它分配地址,为什么?为了完成地址分配需要调用哪些函数

入门例子就是写一个客户端与服务器通信,示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/01/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <sys/socket.h>

/**
* 类似打电话的过程
* 1. 拥有一个电话机
* 2. 准备自己的电话号码
* 3. 插上电话线准备监听
* 4. 拿起电话进行对话

* 1. 有人打电话
*/

//构建套接字,成功返回文件描述符,失败返回-1
int socket(int domain, int type, int protocol);

//给套接字分配地址(IP PORT),成功返回0,失败返回-1
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

//开始监听(将套接字转为可接受请求状态),成功返回 0,失败返回-1
int listen(int sockfd, int backlog);

//处理连接请求,成功返回文件描述符,失败时返回-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

//发起套接字请求
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);


#include <arpa/inet.h>

//用于将点分十进制的IP地址字符串转换为网络字节序(big-endian)的32位IPv4地址
in_addr_t inet_addr(const char *cp);

sockaddrsockaddr_in 的区别

  • sockaddr 用来代表套接字地址,IPv4 or IPv6
  • sockaddr_in 用来特指 IPv4

所以套接字接口使用的是 struct sockaddr,如果定义结构如果使用的是 struct sockaddr_in 则注意强制转换

为了对比,这里也把书中的文件例子重写了一遍,从client.txt读取文件然后写入到另外一个文件server.txt 中

示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/02/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 打开文件 成功时返回文件描述符,失败时返回-1
* path 文件名的字符串地址
* flag 文件打开模式信息
* O_CREAT 必要时创建文件
* O_TRUNC 删除全部现有文件
* O_APPEND 维持现有数据,保存到其后面
* O_RDONLY 只读打开
* O_WRONLY 只写打开
* O_RDWR 读写打开
*/
int open(const char *path, int flag);

/**
* 关闭文件
* 成功时返回 0,失败时返回-1
*/
int close(int fd);

/**
* 数据写入文件
* fd 文件描述符
* buf 数据的缓冲地址值
* nbytes 要传输的字节数
*/
ssize_t write(int fd, const void *buf, size_t nbytes);

/**
* 读取文件中的数据
* fd 文件描述符
* buf 数据的缓冲地址值
* nbytes 要传输的字节数
*/
ssize_t read(int fd, void *buf, size_t nbytes);

服务端运行结果

1
2
3
4
[root]#./server 5555
[02/server.c:9 write_file info] ./02/server.txt TCP/IP 网络编程 client.txt
[02/server.c:18 write_file info] wirte success
[02/server.c:66 main info] write file success

客户端结果

1
2
3
[root]#./client 127.0.0.1 5555
[02/client.c:50 main info] client send msg success
[02/client.c:56 main info] receive server reponse:write file success

参考文档

  1. 《TCPIP 网络编程》