网络编程基础01 — 这些API要熟悉

1.Linux API
套接字相关:

#include <sys/types.h>
#include <sys/socket.h>

/* 功能:创建套接字;
 * 参数:domain - 协议族信息:PF_INET:IPv4互联网协议族;
 *                            PF_INET6:IPv6互联网协议族;
 *                            PF_LOCAL:本地通信的UNIX协议族;
 *                            PF_PACKET:底层套接字的协议族;
 *                            PF_IPX:IPX Novell协议族;
 *       type - 数据传输类型:SOCKET_STREAM:字节流套接字;
 *                            SOCKET_DGRAM:数据报套接字;
 *                            SOCKET_RAW:原始套接字;
 *                            SOOCKET_SEQPACKET:有序分组套接字;
 *       protocol - 协议信息:IPPROTO_TCP:TCP协议;
 *                            IPPROTO_UDP:UDP协议;
 *                            IPPROTO_SCTP:SCTP协议;
 * 返回:成功时返回套接字描述符,失败时返回-1;
 */
int socket(int domain, int type, int protocol);


/* 功能:将IP地址和端口号绑定到套接字上;
 * 参数:sockfd - 套接字描述符;
 *       addr - 指向要绑定给sockfd的协议地址;
 *       addrlen - 地址的长度;
 * 返回:成功时返回0,失败时返回-1;
 */
int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen);


/* 功能:监听套接字;
 * 参数:sockfd - 套接字描述符;
 *       backlog - 连接请求队列中最大连接个数;
 * 返回:成功时返回0,失败时返回-1;
 */
int listen(int sockfd, int backlog);


/* 功能:受理连接请求;
 * 参数:sockfd - 套接字描述符;
 *       clnt_addr - 客户端的地址信息;
 *       addrlen - 客户端地址长度;
 * 返回:成功时返回新创建的与当前处理的连接对应的套接字描述符,失败时返回-1;
 */
int accept(int sockfd, struct sockaddr *clnt_addr, socklen_t *addrlen);


/* 功能:客户端请求与服务器建立TCP连接;
 * 参数:sockfd - 套接字描述符;
 *       serv_addr - 服务器的地址信息;
 *       addrlen - 服务器地址长度;
 * 返回:成功时返回0,失败时返回-1;
 */
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);

文件读写相关:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/* 功能:打开文件;
 * 参数:path - 文件全路径;
 *       flag - 文件打开模式;
 * 返回:成功时返回文件描述符,失败时返回-1;
 */
int open(const char *path, int flag);


/* 功能:关闭文件或套接字;
 * 参数:fd - 要关闭的文件或套接字的文件描述符;
 * 返回:成功时返回0,失败时返回-1;
 */
int close(int fd);


/* 功能:写
 * 参数:fd - 文件/套接字描述符;
 *       buf - 要写入的数据的起始地址;
 *       nbytes - 要写入的字节数;
 * 返回:成功时返回写入的字节数;失败时返回-1;
 */
ssize_t write(int fd, const char *buf, size_t nbytes);


/* 功能:读
 * 参数:fd - 文件/套接字描述符;
 *       buf - 要保存读取数据的地址;
 *       nbytes - 要读取数据的最大字节数;
 * 返回:成功时返回读取的字节数,但遇到文件结束符返回0;失败时返回-1;
 */
ssize_t read(int fd, void *buf, size_t nbytes);

2.sockaddr和sockaddr_in
sockaddr是通用的socket地址,在#include <sys/socket.h>中定义,结构如下:

struct sockaddr
{
	unsigned short sa_family;
	char sa_data[14];
};

其中:
(1)sa_family表示地址族,长度为2B,形式为"AF_xxx",常用的值有:
AF_INET:IPv4地址信息;
AF_INET6:IPv6地址信息;
(2)sa_data表示协议地址信息,长度为14B;

sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,结构如下:

struct sockaddr_in
{
	short int sin_family;
	unsigned short int sin_port;
	struct in_addr sin_addr;
	unsigned char sin_zero[8];
};

其中:
(1)sin_family表示地址族,与sockaddr中的sa_family作用和取值一致;
(2)sin_port表示端口号,必须采用网络字节序,长度为2B;
(3)sin_addr存储IP地址,长度为4B;in_addr的结构定义如下:

struct in_addr
{
	union {
		struct {
			u_char s_b1, s_b2, s_b3, s_b4;
		} S_un_b;
		struct {
			u_short s_w1, s_w2;
		} S_un_w;
		u_long S_addr;
	} S_un;
	#define s_addr S_un.S_addr
};

(4)sin_zero是为了与struct sockaddr保持大小相同而保留的空字节,长度为8B;
sockaddr_in将IP地址和端口号分开,方便赋值,网络编程中一般使用sockaddr_in定义和赋值,然后再强制转换为sockaddr作为函数参数。

3.AF_INET与PF_INET
AF:Address Family,设置地址时使用AF_xxx;
PF:Protocol Family,建立socket时是指定协议,因此使用PF_xxx;
TCP/IP设计时认为某个协议族可能有多重形式的地址,即一个PF对应对个AF,因此做了上述区分;
但是实际上目前为止,一个PF只对应1个AF,没有例外。
实质上,二者是相同的:
#define AF_INET PF_INET

4.Windows API

#include <winsock2.h>

/* 功能:设置winsock版本并初始化相关库;
 * 参数:wVersionRequested - Winsock版本信息;
 *       lpWSAData - WSADATA结构体变量的地址;
 * 返回:成功时返回0,失败时返回非零的错误码;
 */
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);


/* 功能:解除与socket库的绑定并释放系统资源;
 * 参数:无;
 * 返回:成功时返回0,失败时返回SOCKET_ERROR;
 */
int WSACleanup(void);


// 返回:成功时返回套接字句柄,失败时返回INVALID_SOCKET;
SOCKET socket(int af, int type, int protocol);


int bind(SOCKET s, const struct sockaddr *name, int namelen);


int listen(SOCKET s, int backlog);


// 成功时返回套接字句柄,失败时返回INVALID_SOCKET;
SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);


// 成功时返回0,失败时返回SOCKET_ERROR;
int connect(SOCKET s, const struct sockaddr *name, int namelen);


/* 功能:关闭套接字;
 * 参数:s - 套接字句柄;
 * 返回:成功时返回0,失败时返回SOCKET_ERROR;
 */
int closesocket(SOCKET s);


/* 功能:发送数据;
 * 参数:s - 套接字句柄;
 *       buf - 待传输的数据地址;
 *       len - 要传输的字节数;
 *       flags - 传输选项;
 * 返回:成功时返回传输的字节数,失败时返回SOCKET_ERROR;
 */
int send(SOCKET s, const char *buf, int len, int flags);


/* 功能:接收数据;
 * 参数:s - 套接字句柄;
 *       buf - 保存接收数据的地址;
 *       len - 可以接收的最大字节数;
 *       flags - 传输选项;
 * 返回:成功时返回传输的字节数,失败时返回SOCKET_ERROR;
 */
int recv(SOCKET s, char *buf, int len, int flags);

猜你喜欢

转载自blog.csdn.net/NotSoSerious/article/details/85772653