前言
本文内容分两个部分: socket编程基础知识 与 简单实例。提示:阅读前有一定计算机网络知识的基础
一、基础知识
1.Internet套接字
【介绍】
应用层 与 传输层 的通道,由ip地址 + 端口号
【分类】
流格式(stream sockets)
sock_stream: 全双工可靠面向连接的传输,tcp
数据包格式(datagram socket)
sock_dgram: 无连接传输,速度更快,udp
2.socket相关结构体
- socket描述符:int类型
注意:网络字节顺序(Network Byte Order)与 本机字节顺序(Host Byte Order) - struct sockaddr:
struct sockaddr {
unsigned short sa_family; //协议族
char sa_data[14]; //协议地址
};
- struct sockaddr_in:与sockaddr等价,常用
struct sockaddr_in {
short int sin_family; //通信类型
unsigned short int sin_port; //端口
struct in_addr sin_addr; //ip
unsigned char sin_zero[8]; //同sockaddr长度相同
};
- struct in_addr:
struct in_addr {
unsigned long s_addr;
};
- 本机转换
n:网络顺序,h:本机顺序,s:short,l:long
htons()–“Host to Network Short”
htonl()–“Host to Network Long”
ntohs()–“Network to Host Short”
ntohl()–“Network to Host Long”
注:
本机字节顺序:与cpu架构有关,x86为小端序
网络字节顺序:大端序 - ip地址类型转换
p or a:表达形式(ascii字符串)
n:数值形式(二进制数–存在struct in_addr中)
/*1.字符串转化为数值 inet_addr()
注:input=255.255.255.255,output=-1*/
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
/*2.地址形式转化为字符串 ntoa()
注:每次调用会覆盖上次调用*/
printf("%s",inet_ntoa(ina.sin_addr));
/*3.新型转化函数:兼容ipv4,ipv6
*/
int inet_pton(int family, const char *strptr, void *addrptr);
//将表达形式(字符串)转化为数值格式(结构体)
//返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
//将数值格式