乐趣区

关于c:Linux网络开发必学教程1网络编程核心概念与模式

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

网络编程的实质

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

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

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

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

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

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

  • 设施为收发数据而指定的数值,用于示意具体连贯
  • 可了解为:设施中用于网络通讯的数据通道
  • 如:一台电脑往往只领有一个 IP 而又有多个应用程序,此时就应用端口进行辨别

角色

  • 服务端:期待连贯设施
  • 客户端:发动连贯的是恶被

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. 敞开丽娜姐

初探网络编程接口

#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

思考:这次所编写的网络程序是什么角色?

答:客户端

退出移动版