Socket编程:基础部分
来源:互联网 发布:mac win10 iso 下载 编辑:程序博客网 时间:2024/05/17 01:40
这一年多来的学习以及实习经历,特别多的涉及到进程间通信,而且特么的与Socket套接字相关。谈到对它的理解?好吧,只能说基本处在会用的水平。至于更深层次的挖掘工作,之前是一直忽略的。不过,手头全套Stevens的书,基本该翻的也都翻过了。所以反正现在也是闲着,对Socket的复习自然不在话下咧。
概述
所谓的进程间通信(IPC),就是不同的进程之间的数据与信息交换。我们知道,进程之间是相互独立的,均有各自的进程空间。所以,它们之间的数据与信息交换就需要借助一定的方式。在Linux系统中,我们熟知的IPC方式有管道、系统IPC(包括消息队列、信号量以及共享内存)以及套接字Socket。但是,除了Socket方式以外,其他方式基本仅限于单机系统内的进程间通信,而一旦牵涉到网络间的进程通信,也就是不同主机间进程的通信问题,就只能呵呵了。这里主要需要解决的问题:
其一,单机系统内独立进程可单独通过进程号识别,但不同主机间的进程却不行;
其二,各主机的操作系统可能不同,支持的网络协议也不尽一致,即存在多重协议的识别问题;
Socket概念
端口:
端口类似于文件描述符,每个端口拥有一个端口号,用于区别不同端口。端口的作用就是用来标识通信间的进程。进程通过系统调用(bind)与端口绑定,之后绑定进程的所有数据都从该端口接收或者发送。
端口的分配方式有两种:一种是全局分配,一般用于标识服务器,比如一个标准服务器都会拥有一个全局知名端口,即使在不同的机器上,其端口号也相同;另一种是本地分配,多用于客户端,当客户端需要传输服务时,会向本地操作系统提出申请,操作系统则返回一个本地唯一的端口号。另外,TCP/UDP规定端口号小于256的作为保留端口。
套接字对:
一个套接字对是一个定义Socket连接的两个端点的四元组:本地IP,本地端口,远程IP,远程端口。套接字对唯一标识一个网络中的连接。这样标识每个端点的两个值(IP与端口号)即称为一个套接字Socket。
网络字节序:
不同计算机存放字节的顺序是不同的,在低地址存放高位字节的称为大端字节序,相反,低地址存放低位字节的称为小端字节序。而TCP/IP网络中的字节序是大端字节序。所以,为保证接收数据的正确性,必须保证计算机与网络中数据存储的字节序一致。
面向连接与无连接:
面向连接就是每一次完整的数据传输都需要经过连接建立、使用、关闭过程,每个连接相当于一个管道,收发的数据顺序一致,内容相同;无连接则相反,不保证发送顺序,不保证传输的可靠性。TCP是面向连接的,UDP是无连接的。
缓存与带外数据:
为了保证数据传输的正确性或者传输过程能够控制传输速率,都会进行缓存;而在传输过程中,如果希望能够不通过常规传输方式使用户进程处理某一类信息,例如linux中的Ctrl-C中断等信息,称为带外数据。
C/S模式:
在TCP/IP网络中,通信的两个进程一般采用的模式就是C/S模式,即客户端想服务器发出请求,服务器响应请求,提供服务。之所以主要采用这种模式,是基于两点:
1) 网络中软硬件资源、运算能力和信息不均等,需要共享,所以将拥有多资源的主机用以提供服务,资源较少的请求服务;
2) 网络间通信属于异步通信,相互通信的进程不属于父子关系,且不拥有共享缓冲区,因此需要一种机制为二者的数据交换提供同步;
套接字类型:
TCP/IP提供三种套接字类型,分别是流式套接字,数据报套接字,原始套接字。流式套接字提供可靠的面向连接服务,数据无差错、无重复,且按顺序发送,内设流量控制,避免数据流超限;数据报套接字提供了无连接服务,数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱;原始套接字一般用于较底层接口(我没用过)。
Socket编程
Socket中具体的每一个函数我就不详细笔记了,Socket编程的流程基本是固定的,以下简图就ok了。
如下:
- Socket编程:基础部分
- Linux socket 编程,第一部分
- Linux socket 编程,第二部分
- Linux socket 编程,第一部分
- Linux socket 编程,第二部分
- Socket编程基础
- socket编程基础
- socket编程基础
- socket编程基础
- c#socket编程基础
- socket编程基础
- SOCKET 编程基础
- socket编程基础
- Socket网络编程基础
- java Socket编程基础
- socket网络编程基础
- c#socket 编程基础
- socket编程基础
- “菲特”面临四个方面的不利因素
- HDOJ 4324 —— 拓扑排序 || DFS时间戳 || 竞赛图
- 模拟大数据处理、linux下hash_map()使用
- java常用代码一(粘贴即用)---目录
- Android的Intent的Action大全
- Socket编程:基础部分
- hdu 1008 Dogs 广度优先搜索
- 【数据结构】链表
- iOS中对表格数据的修改
- java泛型小问题
- JavaScript的异步实现
- 植物大战僵尸
- hdu2222 Keywords Search (AC自动机)
- UVA - 11489 Integer Game