本文系读书笔记,非深入研究,也无代码,如非所需,请见谅。


哦,这里有份不错的:Linux的SOCKET编程详解


背景

花了好久的时间(大约一周,我太垃圾)看完了一篇英文文章:Bee'j Guide to Network Programming[1]。还有一本书:《TCP/IP Sockets in C - Practical Guide for Programmers》以及一份PPT:《Introduction to Sockets Programming in C using TCP/IP》,不过后二者没有看完就是了,也比较老,毕竟我要用的是IPv6,而非IPv4。【更新,现在说的那本书有了第二版,加入了IPv6的内容,中文翻译:TCP/IP Sockets编程(C语言实现)

其实本科已经学过网络的书,网络最重要的不是ISO/OSI,而是TCP/IP,毕竟据老师所说,ISO/OSI是一群人喝醉酒想出来的,分别对应了7个小矮人[2],最后还晚于事实标准TCP/IP,即便按照ISO/OSI的来了,还失败了,因为太复杂了。

基础

在TCP/IP中,一层层的抽象封装,下层对上层透明不可见,上层都是下层报文格式的数据部分,报头是一些控制信息。



Socket编程位于应用层之下、传输层之上。分为了Stream Socket和Datagram Socket,其实分别对应了传输层的两种协议,TCP和UDP。不过问题就来了,如果是DCTCP这种高级玩意是怎么搞得呢?以后再说吧。

还有C/S架构,其实两种架构:P2P以及C/S各有优缺点吧,不过本文只涉及C/S,B/S是C/S的一种特殊情况,P2P我还没有研究过。C/S架构就是类似下图:



对了,作者是在*nix平台做的,Windows只是提了以下:Winsock.h

流程

Socket编程的流程其实不复杂。



这样整个流程就出来了,就是先创建Socket,然后绑定(bind),其实connect()可以代替bind(),不过区别是,bind()绑定端口,而connect不关心使用哪个端口,当然是对传递的参数来说,connect()会帮程序员找一个未绑定端口进行绑定。服务器端监听对这个端口的连接请求,剩下的就是发送、接收数据了,这里注意Stream Socket(使用TCP连接)和Datagram Socket(使用UDP无连接)的发送和接收使用的函数是不同的。最后不要忘了关闭Socket。



其实剩下的主要是去看各个函数都需要哪些参数,怎么使用就好了,在文章的倒数第二章给了man pages,不贴了。理论上下面应该给出一个Client/Server的程序的,但是我觉着没什么必要。顺着我给的连接[1:1]过去就有很多,不贴了。

不过可以列一下使用了最多的头文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h> #include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

如果有时间,我学艺更精的时候再来补充。

参考


  1. Beej's Guide to Network Programming ↩︎ ↩︎

  2. OSI模型究竟忽悠了多少人? ↩︎

最新文章

  1. 规则“Windows Server 2003 FILESTREAM 修补程序检查” 失败。
  2. Redis 安装与简单示例 01_转
  3. 【转】iOS 开发之协议protocal-代理传值delegate
  4. ~/.ctag的作用与配置
  5. 关于Git中的一些常用的命令
  6. 排序算法(冒泡,选择,快速)Java 实现
  7. poj3693 Maximum repetition substring
  8. python视频教程大全集下载
  9. latex 模版
  10. Sql Server专题一:索引(中)
  11. 在SQLAlter在现场一定的价值
  12. 华为olt ma5680t常用命令详解
  13. DB9针和DB25针串口的引脚定义
  14. Maven自动部署jar包到Neuxs
  15. 玩转spring boot——负载均衡与session共享
  16. yum 安装 jenkins
  17. Table of Contents
  18. Android使用DrawerLayout仿qq6.6版本侧滑效果
  19. 1.spark的wordcount解析
  20. 习惯养成和目标追踪APP推荐

热门文章

  1. spring整合ehcache实现缓存
  2. 使用pandas,numpy进行数据分析建模的一些常用命令
  3. 为啥java要使用 set ()和get()方法---封装
  4. zookeeper 客户端连接报: Will not attempt to authenticate using SASL
  5. ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建
  6. 蚂蚁金服招聘-无线测试开发(20k-36k/月)
  7. ndk-stack使用方法(转)
  8. 分析Android中View的工作流程
  9. Errors running builder JavaScript Validator
  10. u-boot的环境变量详解