sock是对通信端点的抽象;类似于“文件”
小端字节: 英特尔 linux 0x1234;34存在低地址上;
网络上: 大端地址;
//sock初始化所需要的地址
struct sockaddr {
unsigned short sa_family; /* 地址家族, AF_xxx */
char sa_data[14]; /*14字节协议地址*/
};
serv_sock=socket(PF_INET,sock_type,ppe->p_proto);
//AF_INET ipv4;
struct in_addr {
unsigned long s_addr; /* 存4字节的 IP 地址*/
};
struct sockaddr_in {
short int sin_family; /* 通信类型AF */ 本机字节顺序
unsigned short int sin_port; /* 端口 */ 网络字节顺序/* 0随机选择一个没有使用的端口 */
struct in_addr sin_addr; /* Internet 地址 */ 网络字节顺序/* INADDR_ANY; 使用自己的任意IP地址,任意网卡*/
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
//ipv6 地址
struct in6_addr{};
struct sockaddr_in6{}
htons()--"Host to Network Short" //端口号是2字节
htonl()--"Host to Network Long"
ntohs()--"Network to Host Short"
ntohl()--"Network to Host Long"
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
printf("%s",inet_ntoa(ina.sin_addr));
///*******************地址查询*************************//
主机,网络,协议,服务
//主机hostent 查找地址
int gethostname(char *hostname, size_t size); //获取主机名
gethostbyname(const char *name); // www.baidu.com gethostbyname("pzhp-PC");
gethostbyaddr();
gethostent()
sethostent()
endhostent()
typedef struct hostent {
char FAR *h_name;
char FAR FAR **h_aliases;
short h_addrtype;
short h_length;
char FAR FAR **h_addr_list; //网络字节序
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;
//网络netent
getnetbyaddr();
getnetbyname();
getnetent();
setnetent()
endnetent()
//协议protoent 查找协议号
getprotobyname(const char FAR * name); getprotobyname(“udp”);
getprotobynumber()
getprotoent()
setprotoent()
endprotoent()
struct protoent {
char FAR * p_name;
char Far * far * p_aliases;
short p_proto; //以主机字节顺序排列的协议号
};
//服务 查找熟知端口
getservbyname(const char Far * name, const char FAR *proto); getservbyname(“smtp”, “tcp“)
getservbyport()
setservent()
endservent()
struct servent {
char FAR * s_name;
char Far * FAR * s_aliases;
short s_port;
char FAR * s_proto;
};
getsockname()//找socket绑定的地址
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); //连接上,找对方地址
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
socket(域,类型,协议号);
int socket(int domain, int type, int protocol);
int bind(int sockfd, struct sockaddr *my_addr, int addrlen); //有时候不需要显示绑定端口,
//客服端::确定协议(协议号),获取服务器的地址,端口(服务)
记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用
UDP,系统套接字接口会为你自动加上了目标和源的信息。
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //阻塞,非阻塞立马返回-1
//服务器
int listen(int sockfd, int backlog);// backlog等待连接数 <20
int accept(int sockfd, void *addr, int *addrlen); //阻塞,非阻塞返回-1
//交互:
send()
sendto()
sendmsg()
recv()
recvfrom()
recvmsg()
int send(int sockfd, const void *msg, int len, int flags); //flags可置0
int recv(int sockfd, void *buf, int len, unsigned int flags); //flags可置0
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);
closesocket(sockfd);
int shutdown(int sockfd, int how); 0 - 不允许接受 1 - 不允许发送 2 - 不允许发送和接受(和 close() 一样) //双工通信确定;
int select(int numfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
小端字节: 英特尔 linux 0x1234;34存在低地址上;
网络上: 大端地址;
//sock初始化所需要的地址
struct sockaddr {
unsigned short sa_family; /* 地址家族, AF_xxx */
char sa_data[14]; /*14字节协议地址*/
};
serv_sock=socket(PF_INET,sock_type,ppe->p_proto);
//AF_INET ipv4;
struct in_addr {
unsigned long s_addr; /* 存4字节的 IP 地址*/
};
struct sockaddr_in {
short int sin_family; /* 通信类型AF */ 本机字节顺序
unsigned short int sin_port; /* 端口 */ 网络字节顺序/* 0随机选择一个没有使用的端口 */
struct in_addr sin_addr; /* Internet 地址 */ 网络字节顺序/* INADDR_ANY; 使用自己的任意IP地址,任意网卡*/
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
//ipv6 地址
struct in6_addr{};
struct sockaddr_in6{}
htons()--"Host to Network Short" //端口号是2字节
htonl()--"Host to Network Long"
ntohs()--"Network to Host Short"
ntohl()--"Network to Host Long"
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
printf("%s",inet_ntoa(ina.sin_addr));
///*******************地址查询*************************//
主机,网络,协议,服务
//主机hostent 查找地址
int gethostname(char *hostname, size_t size); //获取主机名
gethostbyname(const char *name); // www.baidu.com gethostbyname("pzhp-PC");
gethostbyaddr();
gethostent()
sethostent()
endhostent()
typedef struct hostent {
char FAR *h_name;
char FAR FAR **h_aliases;
short h_addrtype;
short h_length;
char FAR FAR **h_addr_list; //网络字节序
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;
//网络netent
getnetbyaddr();
getnetbyname();
getnetent();
setnetent()
endnetent()
//协议protoent 查找协议号
getprotobyname(const char FAR * name); getprotobyname(“udp”);
getprotobynumber()
getprotoent()
setprotoent()
endprotoent()
struct protoent {
char FAR * p_name;
char Far * far * p_aliases;
short p_proto; //以主机字节顺序排列的协议号
};
//服务 查找熟知端口
getservbyname(const char Far * name, const char FAR *proto); getservbyname(“smtp”, “tcp“)
getservbyport()
setservent()
endservent()
struct servent {
char FAR * s_name;
char Far * FAR * s_aliases;
short s_port;
char FAR * s_proto;
};
getsockname()//找socket绑定的地址
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); //连接上,找对方地址
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
socket(域,类型,协议号);
int socket(int domain, int type, int protocol);
int bind(int sockfd, struct sockaddr *my_addr, int addrlen); //有时候不需要显示绑定端口,
//客服端::确定协议(协议号),获取服务器的地址,端口(服务)
记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用
UDP,系统套接字接口会为你自动加上了目标和源的信息。
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //阻塞,非阻塞立马返回-1
//服务器
int listen(int sockfd, int backlog);// backlog等待连接数 <20
int accept(int sockfd, void *addr, int *addrlen); //阻塞,非阻塞返回-1
//交互:
send()
sendto()
sendmsg()
recv()
recvfrom()
recvmsg()
int send(int sockfd, const void *msg, int len, int flags); //flags可置0
int recv(int sockfd, void *buf, int len, unsigned int flags); //flags可置0
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);
closesocket(sockfd);
int shutdown(int sockfd, int how); 0 - 不允许接受 1 - 不允许发送 2 - 不允许发送和接受(和 close() 一样) //双工通信确定;
int select(int numfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);