网络编程基础API

基础API

  • signal函数
#inculde<signal.h>
void (*signal(int signo, void (*func) (int))) (int);
  • socket函数
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
// domain 底层协议族,PF_INET--> IPv4 ,PF_INET6-->IPv6
// type 服务类型 SOCK_STREAM流服务,SOCK_UGRAM数据报
// protocol 协议
  • 地址
struct sockaddr_in {
	sa_family_t sin_family; // 地址族:AF_INET
	u_int16_t sin_port; //端口号,要用网络字节序
	struct in_addr sin_addr; //IPv4地址结构体
};
struct in_addr {
	u_int32_t s_addr; //IPv4地址,网络字节序表示

};
  • IP地址转换
#include<arpa/inet.h>
int inet_pton( int af, const char* stc, void* dst );
const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);

inet_pton将字符串表示的IP地址src转换为网络字节序IP,并把结果存在dst指向的内存中。
inet_ntop相反

#include<arpa/inet.h>
in_addr_t inet_addr (const char* strptr);
int inet_aton(const char* cp, struct in_addr* inp);
char* inet_ntoa(struct in_addr in);
  • 主机字节序与网络字节序
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htonl(unsigned short int hostlong);
unsigned long int ntohl(unsigned long int hostlong);
unsigned short int ntohl(unsigned short int hostlong);
  • bind
#include<sys/types.h>
#include<sys/socket.h>
int bind (int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

bind将mmy_addr所指的socket地址分配给为未命名的sockfd文件描述符.
errno99:绑定地址或端口有问题

  • listen
#include<sys/scoket.h>
int listen(int sockfd, int backlog);

sockfd指定被监听socket。backlog指定监听最大长度。

  • accept
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t* addrlen);

sockfd是执行过listen系统调用的监听sockfd。accept只是从监听队列中取出连接,而不论连接处于何种状态,更不关心任何网络状况的变化。

  • connect
#include<sys/types.h>
#include<sys/socket.h>
int connect (int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
  • close
#include<unistd.h>
int clost(int fd);

close系统调用并非总是立即关闭一个连接,而是将fd的引用计数减1。当计数为0,才关闭。
立即终止使用shutdown

  • TCP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd, void* buf, size_t len, int flags);
ssize_t send(int sockfd, const void* buf, size_t len, int flags);

recv读取sockfd上的数据,buf和len分别指定缓冲区位置和大小。recv成功时返回读取的数据长度。flags额外控制。

  • UDP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int falgs, struct sockaddr* src_addr, socklen_t * addrlen);
ssize_t sendto(int sockfd, void *buf, size_t len, int falgs, cosnt struct sockaddr* dest_addr, socklen_t * addrlen));
  • 通用数据读写函数
#include<sys/scoket.h>
ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags);
ssize_t sendmsg(int scokfd,struct msghdr*msg, int flags);
struct msghsr {
	void* msg_name:
	socklen_t msg_namelen;
	struct iovec* msg_iov;
	int msg_iovlen;
	void* msg_control;
	socklen_t msg_controllen;
	int msg_flags;
};
struct iovec {
	void *iov_base;
	size_t iov_len;
};
  • 地址信息函数
#include<sys/socket.h>
int getsockname(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);
int getpeername(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);

getsockname获取sockfd对应的本端socket地址,并将其存储与addresss
getpeername获取sockfd对应的远端socket地址

  • socket选项
#include<sys/socket.h>
int getscokopt(int sockfd, int level, int option_name,void *option_value, socklen_t* restrict option_len);
int setscokopt(int sockfd, int level, int option_name,const void *option_value, socklen_t* restrict option_len);
  1. SO_REUSEADDR 可以用来强制使用被处于TIME_WAIT状态的连接占用的socket地址
  2. SO_RCVBUF和SO_SNDBUF
  3. SO_RCVLOWAT和SO_SNDLOWAT
  4. SO_LINGER
  • 网络信息API
  1. gethostbyname和gethostbuaddr
#include<netdb.h>
sturct hostent* gethostbyname(const char* name);
struct hostent* gethostbyaddr(const void* addr, size_t len, int type);
struct hosten {
	char *h_name;
	char** h_aliases;
	int h_addrtype;
	int h_length;
	char **h_addr_list;
};
  1. getservbyname和getservbyport
#include<netdb.h>
struct servent*getservbyname(const char* name, cosnt char* proto);
sturct servent* getservbyport(int port, const char* proto);
struct servent {
	char* s_name;
	char** s_aliases;
	int s_port;
	char *s_proto;
};
  1. getaddrinfo
#include<netdb.h>
int getaddrinfo(cosnt char* hostname, const char* service, cosnt struct addrinfo* hints, struct addrinfo** result);
struct addrinfo {
	int ai_flags;
	int ai_family;
	int ai_socktype;
	int ai_protocol;
	socklen_t ai_addrlen;
	char* ai_canonname;
	struct sockaddr* ai_addr;
	struct addrinfo* ai_next;
};
  1. getnameinfo
#include<netdb.h>
int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值