对应书籍

《tcp/ip网络编程》第一章 理解网络编程和套接字.
我的笔记都是对书籍中知识点的总结, 代码基本都可以在书中找到,我可能略做修改.

初识socket

网络编程又称套接字编程, 套接字我我们提供运输层的服务, 我暂时将其理解为一套接口, 之后再对我的笔记进行修正.

从编程开始

复杂的解释只会让初学者陷入迷茫之中, 不如先来看看简单的代码. 不需要完全弄懂, 看一看就好了.
首先分成两部分: 服务器部分和客户端部分, 这两端分别创建一个套接字, 两个应用可以通过套接字来传递信息. 具体如何传我们来看看代码.

服务器端基本步骤:

先来介绍一下关键的函数, 有个印象就好了, 后面还会详细介绍的.

  1. //1. 创建套接字
  2. #include<sys/socket.h>
  3. int sock(int domain, int type, int protocal);
  4. //成功返回文件描述符, 失败返回-1
  1. //2. 分配IP地址和端口号
  2. #include<sys/socket.h>
  3. int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
  4. //成功返回0, 失败返回-1
  1. //3. 转为可接收请求状态
  2. #include<sys/socket.h>
  3. int listen(int sockfd, int backlog);
  4. //成功返回0,失败返回-1
  1. //4. 受理连接请求
  2. #include<sys/socket.h>
  3. int accept(int sockfd, struct sockaddr *myaddr, socklen_t *addrlen);

服务器代码 (代码比较占地方,这里直接给链接吧,是我自己的gitee仓库哟)

客户端基本步骤:

  1. 创建套接字 sock (和服务器端sock用法一致)

  2. 连接套接字connect

  3. 客户端代码

如何编译

书上讲的比较清楚, 我这里就不赘述了. 不过书上只测试了同一台主机之间是否能发送消息, 我尝试了在两台主机也能发送消息.
我有一台华为云服务器运行服务器端代码, 本地用Mac运行客户端代码. 中途出现了点问题, 客户端无法connect, 原因是没有开放9999端口.

总结

本章主要是动手实践了一下, 一个服务器向一个客户端发送一个字符串. 并没有理解的很深, 课后题目也难以解答. 之后看了后面的章节再来看看课后题.

课后问题:

  1. connect()、listen()和accept()三者之间的关系

  2. 底层文件I/O和ANSI标准I/O的区别