Socket(套接字)是一种计算机网络通信机制,它提供了一种统一的编程接口,使得应用程序可以通过网络进行数据传输和通信。在计算机网络中,Socket通常指的是TCP/IP协议栈中的Socket,也就是套接字接口。
Socket具有以下主要作用:
建立连接:Socket提供了客户端与服务器建立网络连接的机制,使得数据可以在不同计算机之间进行传输。
传输数据:Socket提供了数据读写操作的接口,使得应用程序可以通过网络发送和接收数据。
关闭连接:Socket提供了关闭连接的接口,使得已经建立的网络连接可以被释放和关闭。
在OSI七层模型中,Socket位于第四层(传输层),负责处理端到端的数据传输和可靠性。它能够在网络上建立虚拟通道,保证应用程序之间数据的可靠传输,从而实现网络通信和数据交换。
总之,Socket作为一种通用的网络编程接口,为应用程序提供了方便的网络通信功能,是计算机网络中非常重要的组成部分。
应用编程接口API:就是应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口
标识通信的段端点(对外):IP+端口
操作系统/系统如何管理套接字(对内)
在UNIX中,OS是把socket当做文件统一管理
进程创建Socket时,OS分配一个 数据结构 存储Socket相关信息
Socket数据结构
struct sockaddr_in{
u_char sin_len; /*地址长度 */
u_char sin_family; /*地址族(TCP/IP:AF_INET) ,用来面向其他协议栈*/
u_short sin_port; /*端口号 */
struct in_addr sin_addr; /*IP地址 */
char sin_zero[8]; /*未用(置0) */
}
WSA:Windows Socket Api,和标准API类似,就是在前面加上了WSA,其他基本类似
使用Socket之前必须首先调用WSASrartUP
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
//wVersionRequested:WinSock的版本,16进制参数
//lpWSAData:返回实际WinSock的版本信息
使用2.1版本的WinSock的程序代码段
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
完成对请求的Socket库的使用,最后要调用WSACleanup函数
int WSACleanup (void);
sd = socket(protofamily,type,proto);
//protofamily:协议族 protofamily = PE_INET(TCP/IP)
//type:套接字类型:type = SOCK_STREAM(TCP) / SOCK_DGRAM(UDP) / SOCK_RAW(TCP/IP)
//proto:协议号,默认为0
struct protoent *p;
p=getprotobyname("tcp");
SOCKET sd=socket(PF_INET,SOCK_STREAM,p->p_proto);
int closesocket(SOCKET sd);
// UNIX:close()
//关闭一个描述符为sd的Socket
//多个进程共享一个套接字,调用close 引用数-1,到0才结束
//一个进程中,多个线程共用一个socket ,无计数,调用closesocket,全部关闭
//return 0 成功关闭
int bind(sd,localaddr,addrlen);
//绑定套接字的本地端点地址 IP+端口
//参数sd:socket 标识符 localaddr:端点结构地址
//地址通配符:INADDR_ANY
Server端调用,置监听状态,仅用于面向连接的流套接字TCP
int listen(sd,queuesize);
//queuesize设置连接请求 队列 的大小
// 0:成功
仅用于客户端,
调用connect函数来使客户端套接字sd于服务端saddr连接
TCP UDP 都可以
connect(sd,saddr,saddrlen);
newsock = accept(sd,caddr,caddrlen);
send:TCP套接字 或 调用了 connect函数的UDP客户端套接字
sendto:UDP 中 未调用 connect函数的UDP套接字
send(sd,*buf,len,flags);
sendto(sd,*buf,len,flags,destaddr,addrlen);
recv(sd,*buffer,len,flags);
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
recv:TCP or UDP(调用了connect)
recvfrom:UDP(未调用connect)
int setsockopt(int sd, int level, int optname, *optval, int optlen);
int getsockopt(int sd, int level, int optname, *optval, socklen_t *optlen);
setsockopt:设置套接字sd选项参数
getsockopt:获取任意类型、任意状态 接口 的选项当前值,结果存入optval
网络字节顺序:network byte order
定义了标准的用于协议头中的二进制整数表示
某些Socket API函数的参数需要存储为网络字节顺序:IP 端口
+ htons:本地字节顺序----> 网络字节顺序 16bits
+ ntohs:网络字节顺序----> 本地字节顺序 16bits
+ htonl:本地字节顺序----> 网络字节顺序 32bits
+ ntohl:网络字节顺序----> 本地字节顺序 32bits
getservbyname() : 返回一个指向结构servent的指针
getprotobyname() : 返回一个指向结构protoent的指针