zoukankan      html  css  js  c++  java
  • socket随笔

    图中展示的交互流程如下:

    (1)服务器根据地址类型(ipv4/ipv6)、socket类型,协议创建socket

    (2)服务器为socket绑定IP地址和端口号

    (3)服务器socket监听端口号请求,随时准备接收客户端发来的链接, 这时候服务器的socket并没有被打开

    (4)客户端创建socket

    (5)客户端打开socket,根据服务器的IP地址和端口号视图链接服务器socket

    (6)服务器socket接收到客户端的socket请求,被动打开,开始接受客户端请求,知道客户端返回链接请求。这时候socket进入阻塞状态,。

    所谓阻塞即为accept()方法一直到客户端返回链接信息才返回,开始接收下一个客户端的连接请求。

    (7)客户端连接成功,想服务武发送连接状态信息

    (8)服务器accept方法返回,连接成功

    (9)客户端向socket写入信息

    (10)服务器读取信息

    (11)客户端关闭

    (12)服务器关闭

    仔细看就可以看出来这其实就是三次握手的过程,如下

    1、socket函数

    int socket(int domain,int type,int protocol)

     参数介绍

    1)domain:协议族。常用的协议族有:AF_INET,AF_INET6,AF_LOCAL(UNIX的socket),AF_ROUTE
    协议族决定了socket的地址类型,比如AF_INET就是IPV4与16位端口号的组合,AF_LOCAL就是决定了要用一个绝对路径名作为地址

    (2)type:制定了socket类型。常用的socket类型有:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,SOCK_PACKET,SOCK_SEQPACKET。
    其中
    SOCK_STREAM表示提供面向连接的稳定数据传输,即TCP协议。SOCK_DGRAM表示使用不连接,不可靠的数据包连接

    (3)protocol:指定协议。常用的协议有,IPPROTO_TCP,IPPTOTO_UDP,IPPROTO_SCTP,IPPROTO_TIPC等,他们分别对应TCP传输协议
    UDP传输协议,STCP传输协议,TIPC传输协议

    如果调用成功就返回新创建的套接字的秒速福,如果失败就返回INVALID_SOCKET(linux返回-1)。

    2、bind函数

    bind()函数就是把一个地址族中的特定地址赋给socket。

    1 int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

    参数描述

    1)sockfd:即socket描述字,它是通过socket()函数创建来唯一表示一个socket的。bind()函数就是将给这个描述字绑定一个名字

    (2)addr:一个canst struct sockaddr*指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同

    (3)addrlen:对应的是地址的长度

    一般来说服务器在启动的时候就会有一个地址,用来提供服务,客户就通过他来连接。而客户端就不用指定,系统会自动分配一个端口号

    和自身的IP地址组合。这就是为什么通常服务器端在调用Listen之前会调用bind();而客户端就不用调用,而是在connet()时由系统系统随机生成一个

    函数执行成功返回值为0,反之SOCKET_ERROR

    3、listen和connect函数

    int listen(int sockfd,int backlog)
    
    int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

    listen函数参数

    1)第一个参数为socket描述字
    (2)第二个参数为相应的socket的最大连接个数

    connect函数参数

    1)第一个参数为socket描述字
    (2)第二个服务器的socket地址
    (3)第三个为socket地址的长度

    4、accept函数

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

    参数描述

    1)服务器的socket的描述字(这个描述字是服务器开始调用socket()函数生成的,成为监听的socket描述字)
    (2)只想struct sockaddr *的指针,用来返回客户端的协议地址
    (3)协议地址的长度

    如果成功就由内核自动生成的一个全新的描述字,代表与返回客户的TPC链接

    5、readwrite

    ssize_t read(int fd,void *buf,size_t count)
    
    ssize_t write(int fd,const void *buf,size_t count)
    1)socket的描述字fd
    (2)缓冲区buf
    (3)缓冲区长度count

    read成功时就返回实际所读的字节数,如果返回的值是-表示已经读到文件的结束了,小于0表示出现了错误

    如果错误为EINTR说明是由中断引起的,如果为ECONNREST表示网络连接除了问题

    wirte返回值大于0,表示写了部分或者是全部的数据,返回值小于0此时出现了错误。

  • 相关阅读:
    通过URL地址将图片保存到本地
    Sql批量提交方法
    MySql 批量提交方法
    【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
    【asp.net】滑块验证码(分享一个从github上下载的源码)
    【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
    【C#】初次使用webapi的体会
    【C#】 封装的异步HttpRequest
    Android实现双时间选择器
    Android的金额3位数加逗号分隔
  • 原文地址:https://www.cnblogs.com/tijie/p/10574451.html
Copyright © 2011-2022 走看看