socket 函数
1.创建套接字并返回一个描述符,该描述符可以用来访问套接字
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type ,int protocol);
//domain 指定协议族 ,type指定套接字通信类型,protocol 指定使用的协议
domain 参数可以如下 : AF_UNIX//UNIX域协议(文件系统套接字)
AF_INET //ARPA因特网协议(UNIX网络套接字)
AF_ISO //ISO标准协议
AF_NS //施乐(Xerox)网络系统协议
AF_IPX //Novell IPX 协议
AF_APPLETALK//Appletalk DDS
types 参数如下 :SOCK_STREAM //可靠有序,面向链接的双向字节流, SOCK_DGRAM //数据服务流
protocol 一般默认为0即可
2.套接字地址
每个套接字都有自己的地址格式,对AF_UNIX域套接字来说,由结构sockaddr_un 来描述,定义在头文件 sys/un.h
地址格式:
常用的有两种socket域:AF_UNIX或AF_INET,因此就有两种地址格式:sockaddr_un和sockaddr_in,分别定义如下:
struct sockaddr_in {
shrot int sin_family;//与创建时候的协议族保持一致
unsigned short int sin_port;//端口, 1024 以上
struct in_addr sin_addr;
}
IP地址结构 in_addr 的定义
struct in_addr{
unsigned long int s_addr;//IP地址inet_addr("127.0.0.1"); 这个函数将IP地址返回为这个格式的
}
struct sockaddr_un
{
sa_family_t sun_family; ////与创建时候的协议族保持一致
char sun_path[]; //命名的名称
}
3.套接字命名,
想要通过socket调用创建的套接字可以被其他进程使用,服务器程序就必须给该套接字命名。这样AF——UNIX套接字就会关联
到一个文件系统的路径名,
#include<sys/socket.h>
int bind(int socket , const struct sockaddr *address.size_t address_len);
bind 系统调用把address中的地址分配给与文件描述符socket关联的为命名套接字,地址结构的长度由参数 address_len传递
地址的长度和格式取决于地址族,bind调用需要将一个特定的地址结构指针转换为只想通用地址类型 struct sockaddr *
bind 调用成功返回0。失败反-1
4.创建套接字列队
为了能够在套接字上接受进入的连接,服务器程序必须创建一个列队来保存未处理的请求,
#include<socket.h>
int listen(int socket ,int backlog);
backlog 为未处理连接最大数目,一般为5
listen成功返回0,失败-1
5.接受连接
一旦服务器程序创建并命名了套接字以后,他就可以通过 accept 系统调用来等待客户建立对应套接字的连接
#include<sys/socket.h>
int accept (int socket .struct sockaddr *address ,size_t *address_len)
accept系统调用只有当 有客户程序试图连接到 socket参数指定的套接字时才返回。
6.请求连接
客户程序通过在一个未命名套接字和服务器监听套接字之间建立连接的方法来连接服务器,
#include<sys/socket.h>
int connect(int socket ,const struct sockaddr *address ,size_t address_len);
socket参书指定的套接字将连接到这个服务器的套接字
address 只想结构的长度由address_len指定,
7.关闭套接字
close(int socket) 关闭套接字
8.返回对应于给定地址的主机信息。主机名,IP地址等
#include<netdb.h>
struct hostent *gethostbyaddr(const void * addr, size_t len, int type);
addr:指向网络字节顺序地址的指针。
len: 地址的长度,在AF_INET类型地址中为4。
type:地址类型,应为AF_INET。
struct hostent {
char FAR * h_name; 正规的主机名字(PC)
char FAR * FAR * h_aliases; 一个以空指针结尾的可选主机名队列
short h_addrtype; 返回地址的类型,对于Windows Sockets,这个域总是PF_INET。
short h_length;每个地址的长度(字节数),对应于PF_INET这个域应该为4。
char FAR * FAR * h_addr_list; 应该以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的}
9.返回对应于给定服务名和协议名的相关服务信息。
#include<netdb.h>
sturct servent *getservbyname(const char *name ,const char *proto )
name: 一个指向服务名的指针。
proto: tcp或udp
struct servent {
char FAR * s_name; 正规的服务名。
char Far * FAR * s_aliases; 一个以空指针结尾的可选服务名队列。
short s_port; 连接该服务时需要用到的端口号,返回的端口号是以网络字节顺序排列的。
char FAR * s_proto; 连接该服务时用到的协议名。
};
10.返回本地主机的标准主机名
#include<unistd.h>
int gethostname(char *name ,int namelength);
name: 一个指向将要存放主机名的缓冲区指针。
namelen:缓冲区的长度。
11.
#include<arpa/inet.h>
char *inet_ntoa(struct in_addr in);
将in_addr 格式的IP地址转换成 4个点格式的。