对于网络程序,我们一般分为两类:客户端、服务器端。
服务端程序流程:
1.使用socket设定使用的协议和通信方式(TCP,UDP)
2.使用bind设定提供服务机器的地址,并且与socket关联(确定协议类型和通信方式)
3.使用listen开启端口,并且设定等待队列的大小
4.使用accept等待客户端的连接,并且返回建立连接的套接字
5.使用read在(读数据)和write(写数据)
5.关闭连接
客户端程序的流程:
1.使用socket设定使用的协议和通信方式(TCP,UDP)
2.使用connect连接到服务器,并且与socket关联(确定协议类型和通信方式)
5.使用read在(读数据)和write(写数据)
5.关闭连接
下面为函数的介绍:
int socket (int domain,int type ,int protocol);
include: sys/types.h、sys/socket.h
result:成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。
description: 创建一个网络通信的套接字,确定使用的协议、数据链路的方式。
parameter:
domain:使用的协议类型,常用的是AF_UNIX和AF_INET
AF_UNIX:UNIX域协议(文件系统套接字)
AF_INET:ARPA因特网协议(UNIX网络套接字)
AF_ISO:ISO标准协议,AF_NS:施乐(Xerox)网络 系统协议
AF_IPX:Novell IPX协议
AF_APPLETALK:Appletalk
type:套接使用的链接方式
SOCK_STREAM:表示创建一个有序、可靠、面向连接的双向字节流、
SOCK_DGRAM:
protocol:使用的的协议。0表示使用默认协议。
int bind (int socket, const struct sockaddr *address, size_t address_len);
include: sys/socket.h
result: 成功返回0,失败返回-1并且设置errno
description: 将网络通信的方式和提供服务的机器的地址关联到一起。
parameter:
socket: 所使用的socket描述符,主要用于提供使用的协议的信息
address:通常是通过对sockaddr_un和sockaddr_in两个结构体强制转换得到的。
struct sockaddr_un{
sa_family sun_family; //使用的协议簇。通常赋值为AF_UNIX;
char sun_path[]; //表示提供服务或者要连接服务的名字
};
struct sockaddr_in{
short int; //使用的协议簇。通常赋值为AF_INET;
unsigned short int sin_port; //使用的端口地址
struct in_addr sin_addr;// 使用的ip地址 struct in_addr{unsigned long int s_addr;} 可以使用
//inet_aton()函数将点分十进制转换成in_adrr的数据类型的;
};
address_len:是 sizeof(sockaddr_un)和sizeof(sockaddr_in),表示address的所使用的内存大小。
主要用来确认不同协议使用的地址大小。AF_UNIX协议使用sizeof(sockaddr_un),AF_INET协议使用sizeof(sockaddr_in)
int listen (int scoket, int backlog)
include: sys/socket.h
result: 成功返回0,错误返回-1。
description:将端口绑定到程序,被初始化等待队列。并且设定等待队列最大可以容纳等待连接的个数。
parameter:
socket:需要创建套接字队列的socket
backlog:最大的等待谅解的个数
int accept (int socket, struct sockaddr *address, size_t *address_len)
include: sys/socket.h
result: 成功返回建立通信的套接字,如果失败就返回 INVALID_SOCKET
description:从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建
一个新的套接字来与客户套接字创建连接通道
parameter:
socket: 正在处于监听状态的套接字,也就是在等待客户端的连接的套接字。
address: 通常是通过对sockaddr_un和sockaddr_in两个结构体强制转换得到的。用来存放客户端的ip的。
address_len:是 sizeof(sockaddr_un)和sizeof(sockaddr_in),表示address的所使用的内存大小。
主要用来确认不同协议使用的地址大小。AF_UNIX协议使用sizeof(sockaddr_un),AF_INET协议使用sizeof(sockaddr_in)
int connect (int socket, const struct sockaddr *address, size_t address_len)
include: sys/socket.h
result: 成功则返回0,失败返回-1,
description: 与服务器建立一个通信套接字。
parameter:
socket: 指定与服务器连接使用的协议、数据链路方式。
address: 服务器的地址。常是通过对sockaddr_un和sockaddr_in两个结构体强制转换得到的。
address_len:是 sizeof(sockaddr_un)和sizeof(sockaddr_in),表示address的所使用的内存大小。
主要用来确认不同协议使用的地址大小。AF_UNIX协议使用sizeof(sockaddr_un),AF_INET协议使用sizeof(sockaddr_in)
in_addr_t inet_addr(const char* cp)
include: netinet/in.h
result: 成功返回点分十进制ip对应的unsigned int的值,失败返回-1,
description: 将将点分十进制IPv4地址转化为程序可用的IP地址(unsigned int数据,转换为网络上可以传输的数据存储格式)
parameter:
cp: 点分十进制的ip地址,如"59.69.165.43"