TCP/IP网络编程之套接字

来源:互联网 发布:淘宝分销能改连接页码 编辑:程序博客网 时间:2024/05/02 23:52

服务器端套接字创建过程:

(1)调用socket函数创建套接字,得到套接字文件描述符(Linux下称呼)/套接字句柄(Windows下称呼)

(2)调用bind为套接字分配IP与地址与端口号

(3)调用listen函数将套接字转化为可接收连接的状态

(4)调用accept函数受理连接请求

客户端套接字创建过程:

(1)调用socket函数创建套接字

(2)调用connect函数先服务器端请求连接


创建的套接字因为后续调用的函数的不同而成为不同的客户端,调用bind、listen函数成为服务器端套接字、调用connect成为客户端套接字

服务器端创建的套接字被称为服务端套接字与监听套接字,服务器端套接字只负责数据的监听、并不负责数据的收发。客户端的套接字负责数据的收发。

在Linux中:

由于在Linux中一切皆是文件,因此socket操作与文件操作没有区别,在网络传输过程中也可以使用文件I/O相关函数

文件描述符是文件在被打开或创建时系统返回的一个非负整数,从标准输入(0)、输出(1)、错误(2)开始顺序往上递增直到OPEN_MAX文件描述符相当于文件的代号,好比9527在唐伯虎点秋香中是星爷的代号一样。

使用TCP套接字:

预备步骤0:包含头文件sys/socket.h

(5)(3)调用文件I/O相关函数write或read向套接字中写入/读取数据

(6)(4)调用文件I/O相关函数close关闭套接字

其中第5步也可以使用函数send与recv

在Windows中:

预备步骤0:包含头文件winsock2.h并连接库ws2_32.lib

属性-配置属性-输入-附加依赖项

(0)调用函数WSAStartup初始化winsock与相关库,其参数一需要使用宏函数MAKWORD设置Winsock版本

(5)(3)调用函数send与recv发收数据(win下严格区分文件与套接字,必须使用这两函数)

(6)(4)调用函数closesocket关闭套接字并WSACleanup注销winsock库


将创建套接字比喻为打电话:

服务器端:安装电话机(创建套接字)、为电话机分配区号与电话号码(绑定IP与端口)、连接电话线(将套接字转化为可接收连接的状态)、等待并接听电话(受理连接请求)、通话(收发数据)、挂电话(关闭套接字)

客户端:安装电话机(创建套接字)、拨号打电话(请求指定IP与端口)、通话、挂电话


关于协议:简单的说就是计算机间为了完成数据交换而定的约定

套接字类型:

1、面向连接套接字(SOCK_STREAM)(2)面向消息的套接字(SOCK_DGRAM)

面向连接套接字特点:

(1)传输过程中数据不会丢失

(2)按序传递数据(先传一定先到)

(3)传输的数据无数据边界

(4)套接字需一一对应(在一个TCP通信中,仅有两个同样特性的套接字连接)

无数据边界:

套接字内部有一个buffer(字节数组)用于保存通过套接字传输的数据,可以在buffer满后一次读取,也可以分成读取

可靠性:当read函数读取速度比接收数据慢时,缓冲区有可能满,此时为保证传输可靠性,套接字将停止数据传输,也就是说 面向连接的套接字会根据接收端的状态传输数据,如果出错还会重传。

总结:面向连接的套接字是可靠的、按序传递的、基于字节的、两方连接的套接字

2、面向消息套接字特点:

(1)强调快速而非顺序(有比面向连接更快的速度)

(2)数据可能丢失或损毁(无法避免数据丢失或损毁)

(3)数据有数据边界(接受次数必须与发送次数一致)

(4)限制每次传输数据大小(传输大的数据需要分多次发送、多次接受)

(5)无连接

总结:面向消息的套接字是不可靠的、不按顺序的、以数据高速传输为目的的、限制数据包大小且不存在连接的套接字











0 0
原创粉丝点击