网络之Socket详解

网络之Socket详解

1.什么是Socket?

Socket本质上还是文件,因为Linux上一切皆文件。Socket也有对应的文件描述符(fd)。文件描述符相关的参考另外一篇博客。

http://blog.csdn.net/weililansehudiefei/article/details/78113082

在这里简单就认为,它是对应着一个文件的,就可以。

Socket位于TCP/IP之上,通过Socket可以方便的进行通信连接。对外屏蔽了复杂的TCP/IP。

2.Socket连接详解

Socket连接建立的基本过程如下:

接下来就按照这个流程进行

1.int socket(int domain,int type,int protocol);

该方法 返回一个socket_fd,即socket的文件描述符

domain:说明我们网络程式所在的主机采用的通讯协族(AF_UNIX和AF_INET等). AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而能允许在远程主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现所以用PF代替了AF,不过我们都能使用的).

type:我们网络程式所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)SOCK_STREAM表明我们用的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特流. SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信.

protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就能了 socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看errno可知道出错的周详情况.

2.int bind(SOCKET socketfd, const struct sockaddr* address, socklen_t address_len);

sockfd:是由上一步socket调用返回的文件描述符.

addrlen:是sockaddr结构的长度.

my_addr:是个指向sockaddr的指针.在<linux/socket.h>中有 sockaddr的定义

struct sockaddr{

unisgned short  as_family;

char           sa_data[14];

};

不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct   sockaddr_in)来代替.在<linux/in.h>中有sockaddr_in的定义

struct sockaddr_in{

unsigned short         sin_family;

unsigned short int      sin_port;

struct in_addr          sin_addr;

unsigned char          sin_zero[8];

我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表示能和所有的主机通信,sin_port是我们要监听的端口号.sin_zero[8]是用来填充的. bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket相同

3.int listen(int socketfd,int backlog);

ilsten通过socket套接字和该套接字绑定的IP信息在内核开启监听,并且返回监听描述符。此处监听工作交给内核处理,代码本身不阻塞,但内核对应端口一直在做监听工作。同时维护两个队列,一个是请求队列,一个是就绪队列,大小由backlog决定。

4.int accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen);

接受连接请求,代码默认阻塞。accept实际上是在从内核listen维护的就绪队列中取描述符。accept成功时返回最后的服务器端的文件描述符。重要:这里返回的是一个新的Socket,即socketfd_new.而不是最开始创建的socketfd。用socket_new进行与客户端的通信。

服务器的一个端口,是只能有一个socket绑定的。新生成的socketfd_new虽然有和处理连接请求的socket一样的ip和端口,但是他门不占用端口。我的理解,就是这些新生成的socketfd_new,没有进行bind的操作,所以没有和内核绑定,所以没出现冲突。而socketfd本质上有五大因素决定(fd,src_ip,src_port,des_ip,des_port)。socket里是存放了双方的ip的。

所以,accept方法返回的socketfd_new,已经有了双端的ip和端口,那么久可以进行通信了。

那么,当客户端发送数据过来的时候,究竟是与哪一个socket对象通信呢?

客户端发送过来的数据可以分为2种,一种是连接请求,一种是已经建立好连接后的数据传输。

由于TCP/IP协议栈是维护着一个接收和发送缓冲区的。在接收到来自客户端的数据包后,服务器端的TCP/IP协议栈应该会做如下处理:如果收到的是请求连接的数据包,则传给监听着连接请求端口的socetfd套接字,进行accept处理;如果是已经建立过连接后的客户端数据包,则将数据放入接收缓冲区。这样,当服务器端需要读取指定客户端的数据时,则可以利用socketfd_new 套接字通过recv或者read函数到缓冲区里面去取指定的数据(因为socketfd_new代表的socket对象记录了客户端IP和端口,因此可以鉴别)。

5.int connect(int sockfd,const struct sockaddr *addr, socklen_t addrlen)

sockfd:socket:客户端socket返回的文件描述符.

serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址

addrlen:serv_addr的长度

connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符失败时返回-1

原文:https://blog.csdn.net/weililansehudiefei/article/details/78111569

原文地址:https://www.cnblogs.com/aaronRhythm/p/11007999.html

时间: 2024-10-07 00:52:40

网络之Socket详解的相关文章

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

Android中的几种网络请求方式详解

http://blog.csdn.net/zuolongsnail/article/details/6373051 Android应用中使用AsyncHttpClient来异步网络数据 http://blog.csdn.net/sdvch/article/details/13615605 Android中的几种网络请求方式详解,布布扣,bubuko.com

iOS开发——使用Charles进行https网络抓包详解

我在前面两篇博客中<网络抓包工具Charles的介绍与使用><iOS开发--使用Charles进行http网络抓包详解>对Charles的http抓包进行了详细的讲解.今天我们来实现一下进行https的抓包,比http抓包稍微麻烦一点. (1)https初级的配置请参考<网络抓包工具Charles的介绍与使用>中的https配置部分. (2)由于目前iOS9更改了对于https网络的安全机制,所以还需要在iPhone上安装一个证书,安装方式如下: 在iPhone的Saf

VM网络连接设置详解

参考http://zhidao.baidu.com/link?url=NU8UcLsp6CCgRZzeMgnb7v0p7Z78eLYloYW355Z9fQa__pm_lFBtpfSs61ZR2Wq2yX1ljRrgiP2NGOccH_CttK 桥接 通过使用物理机网卡 具有独立ip NAT 把物理机作为路由器进行上网 host-only 只能与物理机相连 下面是详细的解说 VMWare提供了三种工作模式,它们是bridged(bridged模式).NAT(网络地址转换模式)和host-only(

《Java网络编程核心技术详解》赶稿中......

<精通JPA与Hibernate:Java对象持久化技术详解>这本书写完,就开始着手写<Java网络编程核心技术详解>一书,已经写了一大半,内容包括:Java网络编程的基础知识. 套接字编程.非阻塞通信.创建HTTP服务器与客户程序.数据报通信.对象的序列化与反序列化.Java反射机制.RMI框架.JDBC API.JavaMail API.MVC设计模式.XML处理.安全网络通信.CORBA和Web服务. 每写一章,都会遇到一些挑战,主要是在调试程序时,没有出现预期的结果.例如分

好消息:《Java网络编程核心技术详解》出版

2019年5月从美国回到上海,由于一切都不安定,先在旅馆里宅了4个多月,写完<精通JPA与Hibernate:Java对象持久化技术详解>,就开始写这本书.现在,正是新冠病毒疫情还没结束之际,本书克服种种困难,如期和读者见面了. 我们一不小心,就会被一种潜在的观念暗示:只要忙过了这一阵,将来就能过上高枕无忧的生活.实际上,生活中总是有各种意外的事情发生,小到个人家庭的琐事,大到国家社会的暂时的不安定.为了能随遇而安,就得常常給自己洗脑,不要以为忙过了这一阵,就会有永远太平安宁的出头之日. 戒骄

Linux网络配置知识点详解

Linux网络配置知识点详解 一.Linux网络配置 1.网络配置文件 (1)/etc/sysconfig/network-scripts/ifcfg-en0xxx文件 用来指定服务器上的网络配置信息 (2)/etc/hostname文件 包含了Linux系统的主机名 (3)/etc/resolv.conf文件 文件配置了DNS客户,包含了主机的域名搜索顺序和DNS服务器地址 (4)/etc/hosts IP地址和主机名映射 (5)/etc/host.conf 和主机名解析顺序 (6)/etc/

计算机基础-Socket详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

Socket详解-Linux Socket编程(不限Linux)

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?