问题:如何进行网络编程?

网络编程的本质

使用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力

image.png

网络接口在代码层面是操作系统提供的函数

  • 网络编程只是一系列系统函数的花式玩法

应用程序通过网络接口使用操作系统的联网能力

  • 网络编程是特定领域(网络)的 C 语言程序设计

协议:为进行数据通讯而预定义的数据规则
地址:网络通讯中的用于标识设备的整数值(“xxx.xxx.xxx.xxx” 4字节整形值可表示,单为了更容易记忆,转换为字符串)
端口号

  • 设备为收发数据而指定的数值,用于表示具体连接
  • 可理解为:设备中用于网络通讯的数据通道
  • 如:一台电脑往往只拥有一个 IP 而又有多个应用程序,此时就使用端口进行区分

角色

  • 服务端:等待连接设备
  • 客户端:发起连接的是恶被

image.png

ps : 一台设备可同时作为客户端和服务端

网络知识充电站

网址就是 IP 地址吗? URL 是什么,域名又是什么?

  • 网址不是 IP 地址,是指网络信息资源的地址(如:具体网页的地址),即:URL
  • 域名是 IP 地址的名别,多个域名可以指向同一个 IP 地址
  • 域名 → DNS → IP 地址

协议一定是看不懂的二进制数据吗?

  • 协议是一种约定,即:预先定义的规则
  • 协议可以基于文本定义,也可以基于二进制定义
小端系统:采用小端模式(little-endian)的系统,即:数据低字节放在内存低地址中
0x12345678  int 4字节
低地址 👉 |78|56|34|12| 👈 高地址 
大端系统:采用大端模式(big-endian)的系统,即:数据低字节放在内存高地址中
0x12345678  int 4字节
低地址 👉 |12|34|56|78| 👈 高地址 
网络字节序:网址字节顺序采用大端模式,所以,在小端系统中需要做字节转换

网络编程模式

1. 准备连接
2. 连接远程设备
3. 收发数据
4. 关闭丽娜姐

image.png

初探网络编程接口

#include <sts/types.h>
#include <sys/socket.h>

函数原型功能描述
int socket(int domain, int type, int protocal);创建套接字,为网络连接做准备
int connect(int socket, struct sockaddr *addr, socklen_t len);连接指定地址的远程设备
ssize_t send(int fd, const void *buf, size_t n, int flags);发送数据到远程设备
ssize_t recv(int fd, void *buf, size_t n, int flags);接收远程设备发回的数据
int close(int fd);关闭连接,销毁套接字

编程实验:网络编程初体验

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{  
   int sock = 0;
   struct sockaddr_in addr = {0};
   char *tosend = "GET /index.html HTTP/1.1\nHOST: www.dt4sw.com\nUser-Agent: TEST\nConnection: close\n\n";
   int len = 0;
   char buf[128] = {0};
   int r = 0;

   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("connected error\n");
      return -1;
   }

   printf("connect success\n");

   len = send(sock, tosend, strlen(tosend), 0);

   printf("send bytes = %d\n", len);

   len = 0;
   do {
      int i = 0;

      r = recv(sock, buf, sizeof(buf), 0);

      if (r > 0) {
         len += r;
      }

      for (i=0; i<r; ++i) {
         printf("%c", buf[i]);
      }
   } while (r > 0);

   printf("\n");
   printf("recv bytes = %d\n", len);

   return 0;
}

输出:

./a.out 
connect success
send bytes = 81
HTTP/1.1 200 OK
Content-Type: text/html

......
......

  <script src="./static/js/app.js"></script>
</body>
</html>
recv bytes = 22382
思考:这次所编写的网络程序是什么角色?

答:客户端


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧