同时学 Linux和Windows 的原因
大多项目在 Windows/Linux 下开发 client/server 端, 单独学1种平台 没实践意义
两大平台下 socket 编程非常相似
网络编程 就是 编写程序 使两台联网的计算机 相互交换数据
, 这就是 socket 全部内容
吗?是的!
socket 编程 远比想象中简单
chapter1 socket 简介
socket: 套接字, 计算机间通信的一种 约定
socket 典型应用: Web 服务器 和 浏览器
浏览器
获取 用户输入的 URL
向 服务器 发起请求
服务器
分析收到的 URL
将对应的网页内容返回给浏览器
浏览器
解析和渲染, 将文字、图片、视频 呈现给用户
1 IP Address
(1) 封装
到要发送的数据包
(2) 被 路由器
用于 寻址
: 据 IP Address 找到 dst 计算机
本机地址: 127.0.0.1
2 Port
(1) 用于 区分
不同的 网络程序
网络程序 端口号
Web 服务 80
FTP 服务 21
SMTP 服务 25
(2) 是 虚拟/逻辑 概念
可视为 一道门
, data 通过这道门 流入流出, 每道门有不同的 编号
, 即 端口号
3 Protocol
网络通信的双方遵守的约定
TCP/IP 协议族: TCP IP UDP Telnet FTP SMTP 等上百个关联协议
TCP IP 常用
4 数据传输方式
常用2种:
(1) SOCK_STREAM
面向连接
重发
http 协议用
(2) SOCK_DGRAM
无连接
不作数据校验
错了不重发
QQ 视频/语音聊天 用
总结
IP Address 和 Port
能在互联网中 定位到要通信的程序
Protocol 和 数据传输方式
规定了 如何传输 数据
有了这些, 两台计算机就可以通信了
chapter2 Linux 下 socket 程序 Demo
功能: client 从 server 读1个字符串, 并打印出来
Linux 中, socket 也是文件, 有文件描述符, 可用 write() / read() 进行 I/O
// server.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
// [1] 建 套接字: IPv4 地址 / 面向连接的传输方式 / TCP 协议
int listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Note: 指定 本端(Server) 协议族 / port / ipaddr
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 具体的IP地址
serv_addr.sin_port = htons(1234)