socket接口
伯里克利(berkeley)扩展了socket接口,使其支持了UNIX下的TCP/IP协议,socket接口是一个编程接口,是一个特殊的文件描述符(everything in Unix is a file)
socket类型
流式套接字(SOCK_STREAM):对应TCP。
数据报套接字(SOCK_DGQAM):对应UDP。
原始套接字(SOCK_RAM):可以对IP、ICMP直接访问。
端口
在利用socket接口时,在传输层需要端口号,端口号是用来区分不同的进程的,IP地址是用来区分哪个主机的,通过端口号和IP地址就可以找到指定的主机的哪一个进程。
端口号用两个字节来表示
选用的端口号可以是1024-49151
字节序
小端序:低序字节存储在低地址
大端序:高序字节存储在低地址
网络中的传输数据必须使用网络字节序,即大端字节序。
字节序的转换
输入端口号时要用到。
主机字节序(小端)–>网络字节序(大端):
//host->network
u_long htonl (u_long hostlong)
//用端口字节序的转换(端口号为2个字节)
u_short htons (u_short hostshort)//常用
网络字节序(大端)–>主机字节序(小端):
//network-->host
u_long ntohl (u_long hostlong)
//用端口字节序的转换(端口号为2个字节)
u_short ntohs (u_short hostshort)
IP地址的转换
字符串到数字的转换,即198.168.55.4(人看的字符)–>数字(计算机的数字)
typedef uint32_t in_add_t;
struct in_addr
{
in_addr_t = s_addr;
}
//字符-->数字
in_addr_t inlet_addr(const char *cp);
//数字-->字符
char *inet_ntoa(struct in_addr in);
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
int main(int agrc, char const *argv[])
{
//定义in_addr_t类型的ip_num
in_addr_t ip_num;
//将字符转换为数字
ip_num = inet_addr("192.168.15.25");
printf("addr = 0x%x\n", ip_num);
//定义in_addr类型的结构体in
struct in_addr in;
//将in中的结构体成员s_addr赋值
in.s_addr = ip_num;
printf("convert ip:%s\n", inet_ntoa(in));
return 0;
}