网络编程的概念和模式
网络编程的本质
- 使用操作系统提供的网络接口,使得应用程序具备收发网络数据的能力;
- 网络接口在代码层面是由操作系统提供的函数:
– 网络编程只是一系列系统函数的花式玩法(即特定领域的C语言程序开发);
网络编程核心概念
- 协议:为进行数据通信而预定义的数据规则;
- 地址:网络通信中用于标识设备的整数值(4字节的整型值,有时用字符串来表示,比如“192.168.1.2”);
- 端口号:
– 设备为收发数据而指定的数值用于标识具体连接;
– 可理解为:设备中用于网络通信的设备通道; - 角色:
– 服务端:等待连接的设备(会将自身的IP/域名地址暴露在网络中,供客户端访问);
– 客户端:发起连接的设备;
网络知识补充
- 网址、IP地址、URL、域名分别是什么?
– 网址是网络信息资源的地址(具体到某一网站下某一网页的地址),即URL;
– 域名是IP地址的别名(通过DNS服务器从域名解析出对应的IP地址),多个域名可指向同一个地址; - 协议:
– 协议是一种约定,通信双方在通信前预先定义好的信息处理规则;
– 协议可以基于文本,也可以基于二进制定义; - 小端系统:
– 采用 小端模式(little-endian) 的系统,即:数据低字节放在内存低地址中; - 大端系统:
– 采用大端模式(big-endian)的系统,即:数据低字节放在内存高地址中; - 网络字节序:
– 网络字节顺序采用大端模式,所以:在小端系统中需要做字节序转换;
网络编程模式
初探网络编程接口
- 头文件包含:
– #include <sys/types.h>
– #include <sys/socket.h>
函数原型 | 功能描述 |
---|
int socket (int domain,int type,int protocal); | 创建套接字,为网络连接做准备 |
int connect (int sock,struct sockaddr* addr,socklen_t len); | 连接指定地址的远程设备 |
ssize_t send (int fd,const void* buf,size_t n,int flags); | 发送数据到远程设备 |
ssize_t recv (int fd,const void* buf,size_t n,int flags); | 接收远程设备发回的数据 |
int close (int fd); | 关闭连接,销毁套接字 |
网络编程示例
sock = socket(PF_INET,SOCK_STREAM,0);
if(sock == -1)
{
printf("socket error\n");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("47.99.217.175");
addr.sin_port = htons(80);
if(connect(sock,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
printf("connect error\n");
return -1;
}
len = send(sock,tosend,strlen(tosend),0);
printf("send bytes = %d\n",len);
len = recv(sock,buf,sizeof(buf),0);
printf("receive bytes = %d\n",len);