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此时出现了错误。

  • 相关阅读:
    HDU 1025 Constructing Roads In JGShining's Kingdom (DP+二分)
    HDU 1158 Employment Planning
    HDU 2059 龟兔赛跑
    Csharp 简单操作Word模板文件
    Csharp windowform datagridview Clipboard TO EXCEL OR FROM EXCEL DATA 保存datagridview所有數據
    Csharp 讀寫文件內容搜索自動彈出 AutoCompleteMode
    Csharp windowform controls clear
    CSS DIV大图片右上角叠加小图片
    Csharp DataGridView自定义添加DateTimePicker控件日期列
    Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  • 原文地址:https://www.cnblogs.com/tijie/p/10574451.html
Copyright © 2011-2022 走看看