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


哦,这里有份不错的: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模型究竟忽悠了多少人? ↩︎

Socket编程简介的更多相关文章

  1. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  2. SOCKet 编程 简介

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  3. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  4. Linux Socket 编程简介

    在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...

  5. UNIX SOCKET编程简介

    1  .  Layered Model of Networking Socket  编程的层次模型如下图所示,   最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层 ...

  6. Socket 编程简介

    Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 本章节我们为大家接收 Perl ...

  7. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  8. Java Socket编程示例

    一.Socket简介: 1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket ...

  9. 在线服务之socket编程科普

    简介 本篇文章是介绍一个典型的在线C++服务的最底层socket管理是如何实现的. 文章会从一个最简单的利用socket编程基础API的一个小程序开始,逐步引入现在典型的select,epoll机制, ...

随机推荐

  1. Spring中@Resorce和@Autowired的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  2. 在腾讯云centos7.2上安装配置Node.js记录

    应为爱好前端所以打算在腾讯云服务器上安装JavaScript引擎Node.js,下面是安装步骤: 安装准备: 下载node.js的.tar.xz安装包:https://nodejs.org/dist/ ...

  3. Java學習筆記(基本語法)

    本文件是以學習筆記的概念為基礎,用於自我的複習紀錄,不過也開放各位的概念指證.畢竟學習過程中難免會出現觀念錯誤的問題.也感謝各位的觀念指證. 安裝JDK 在Oracle網站中找自己系統的JDK下載位置 ...

  4. redis命令学习(二) · THIS SPACE

    列表(Lists)操作命令 Redis列表是简单的字符串列表,按照插入顺序排序. 你可以添加一个元素导列表的头部(左边)或者尾部(右边)LPUSH命令插入一个新的元素导头部,而RPUSH插入一个新元素 ...

  5. 12月18日风险投资速递:Facebook收购实时体育数据提供商Sport Stream

    国内公司 1.手游公司成都掌沃无限获得近千万元天使投资 成都掌沃无限成立于2013年,是一家新成立的手机游戏开发商,创始人及CEO张涛拥有超过10年的游戏行业从业经验和连续创业经历,其首款游戏产品为& ...

  6. B站实战第三天

    B站实战第三天 用了两天多的时间才把B站页面的头部写完,今天来写头部下面的导航栏部分和轮播图一些模块. 因为还没学js,轮播图部分用swiper来实现. 今天首先复习的知识点是弹性盒模型. 弹性盒模型 ...

  7. 简单的java开源图床

    出于自用的目的,又找不到Java写的开源的程序,然后使用开源上传组件bootstrap-fileinput用 Spring Boot 写了一个图床 目前支持:七牛云,阿里云 GitHub: https ...

  8. 一步一步理解AdaBoosting(Adaptive Boosting)算法

    最近学习<西瓜书>的集成学习之Boosting算法,看了一个很好的例子(https://zhuanlan.zhihu.com/p/27126737),为了方便以后理解,现在更详细描述一下步 ...

  9. 【JavaScript】DOM之Document对象

    JS(JavaScript) 一.Document对象 1.Document对象是什么 Document对象 是DOM的基本规范也是重要的对象之一,以访问,更新页面内容的属性和方法通过conslie. ...

  10. Ubuntu几秒钟没有任何操作自动黑屏

    在鼠标或键盘30秒内没有做任何操作以后,显示器自动黑屏. 重新点击鼠标或键盘,屏幕唤醒. 设置中心各种设置方式都已经尝试过.无效. $xset -q // 执行该命令 Keyboard Control ...