socket编程基础知识介绍

socket编程基础知识介绍

1) socket概论

TCP/IP是计算机互连最常使用的网络通讯协议, TCP/IP的核心部分由网络操作系统的内核实现,应用程序通过编程接口来访问 TCP/IP,见下图:

socket编程基础知识介绍

1应用程序与Windows Socket关系图

七十年代中,美国国防部高研署(DARPA)将TCP/IP的软件提供给加利福尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。这个API称为Socket接口。今天,SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API

Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。在应用开发中就像使用文件句柄一样,可以对 Socket句柄进行读、写操作。我们将 Socket翻译为套接字,套接字分为以下三种类型:

字节流套接字Stream Socket)是最常用的套接字类型,TCP/IP协议族中的 TCP 协议使用此类接口。字节流套接口提供面向连接的(建立虚电路)、无差错的、发送先后顺序一致的、无记录边界和非重复的网络信包传输。

数据报套接字 Datagram SocketTCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,它以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点。数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。

原始数据报套接字Raw Socket)提供对网络下层通讯协议(如IP协议)的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。

socket编程基础知识介绍

2面向连接协议的SOCKET编程模型

2) 常用socket API

int bind(int sockfd,struct sockaddr *my_addr, int addrlen);

int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);

int listen(int sockfd int backlog);

int accept(int sockfd, void *addr, int *addrlen);

int close(sockfd);

//int shutdown(int sockfd,int how);

int send(int sockfd, const void *msg, int len, int flags);

int recv(int sockfd,void *buf,int len,unsigned int flags);

int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);

int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

3) 常用socket结构