最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Linux服务器开发-基础教程总结(3)-网络编程

互联网 admin 2浏览 0评论

Linux服务器开发-基础教程总结(3)-网络编程

目录

  • 前言
  • 正文
    • 1. 网络编程
      • server.c
      • client.c
    • 2. IP段格式
    • 3. 以太网帧
    • 4. TCP/IP数据包
    • 5. 打洞机制
    • 6.Socket编程
      • 1. 套接字原理
      • 2. 大小端的转换
      • 3. socket数据结构
      • 4. ip地址转换函数
      • 5. socket函数
      • 6. listen函数
      • 7. accept函数
      • 8. connect函数
      • 9. Socket编程流程图
      • 10. server.c +client.c
    • 11. 错误处理函数
      • 1. Readn
  • 参考

前言

正文

1. 网络编程

server.c

code

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
int main()
{int lfd,cfd;struct sockaddr_in serv_addr,clie_addr;socklen_t clie_addr_len;char buf[BUFSIZ];int n,i;lfd = socket(AF_INET,SOCK_STREAM,0);serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));listen(lfd,128);clie_addr_len = sizeof(clie_addr);cfd = accept(lfd,(struct sockaddr*)&clie_addr,&clie_addr_len);while(1){n = read(cfd,buf,sizeof(buf));for(i = 0;i<n;i++)buf[i] = toupper(buf[i]);write(cfd,buf,n);}close(lfd);close(cfd);return 0;
}

client.c

2. IP段格式

3. 以太网帧

4. TCP/IP数据包

5. 打洞机制

  1. 路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包。

什么是打洞,我们假设两个扣扣A,B,他们通信需要通过腾讯的服务器。也就是A发送消息给B的话,需要通过腾讯服务器进行一次转发,才到B那里。但像视频通话这要实时性要求比较高的通信,再用这种方式就不能保证他们通信的实时性,如果能想一个办法让他们直接通信,这样实时性就会高很多。但是我们所知的路由器是有一个保护机制的(对于陌生的IP第一次发送过来的数据包,会进行屏蔽或丢弃,主要是为了防止网络的恶意攻击),A跟B想进行通信的话所携带数据包的IP就必须是熟悉的,所以说这个时候就需要在两个路由器之间打一个洞,而这件事情上腾讯就参与进来了。
简单来说在我们登入扣扣的时候,就会访问腾讯服务器,而腾讯服务器也会回一个数据包,这个数据包会携带腾讯服务器公网的IP,相对于来说服务器的公网IP在A、B那里都是熟悉的IP(就是为了防止陌生IP屏蔽),而服务器借助公网IP帮助A、B完成打洞(打洞就是实现一种通路),当它把这个洞打好以后A、B就可以实时通信。打洞是由服务器来完成的,最终的目的就是为了提高数据传输的效率。

  1. UDP打洞

所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且可获取客户端A地址和端口号。同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来的数据包后获取B的地址和端口号,将A和B的地址与端口号分别发送给对方,这样双方可以继续用UDP协议通信。这么做有什么用呢?因为对于一些应用或者需求,需要两个客户端临时做一些通信,而这种通信不需要建立tcp就可以完成,所以才去udp打洞。

  1. 公私服务器的建立

a. 公-公:直接映射
b. 公-私:NAT映射
c. 私-公:NAT映射
d. 私-私:NAT映射,打洞机制

6.Socket编程

1. 套接字原理

  1. 网络字节序采用的是大端字节流。
  2. X86平台采用的是小端存储(高位字节存储在低地址,低位字节存储在高地址)。

2. 大小端的转换

3. socket数据结构

4. ip地址转换函数


5. socket函数

6. listen函数

作用:同时,允许多少个客户端与服务端建立连接。
这个只是用来设置监听限定的,同时有多少个服务器能与其连接。

7. accept函数

  1. 返回的是一个 新的文件描述符。
  2. 如果调用完这个函数,还是没有客户端发起要与本服务端建立连接的话,就会一直阻塞。

8. connect函数

9. Socket编程流程图

10. server.c +client.c

11. 错误处理函数

1. Readn


2. Writen

3. ReadLine

参考

  1. C/C++高级编程系列(4)之Linux服务器开发三-网络编程

Linux服务器开发-基础教程总结(3)-网络编程

目录

  • 前言
  • 正文
    • 1. 网络编程
      • server.c
      • client.c
    • 2. IP段格式
    • 3. 以太网帧
    • 4. TCP/IP数据包
    • 5. 打洞机制
    • 6.Socket编程
      • 1. 套接字原理
      • 2. 大小端的转换
      • 3. socket数据结构
      • 4. ip地址转换函数
      • 5. socket函数
      • 6. listen函数
      • 7. accept函数
      • 8. connect函数
      • 9. Socket编程流程图
      • 10. server.c +client.c
    • 11. 错误处理函数
      • 1. Readn
  • 参考

前言

正文

1. 网络编程

server.c

code

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
int main()
{int lfd,cfd;struct sockaddr_in serv_addr,clie_addr;socklen_t clie_addr_len;char buf[BUFSIZ];int n,i;lfd = socket(AF_INET,SOCK_STREAM,0);serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));listen(lfd,128);clie_addr_len = sizeof(clie_addr);cfd = accept(lfd,(struct sockaddr*)&clie_addr,&clie_addr_len);while(1){n = read(cfd,buf,sizeof(buf));for(i = 0;i<n;i++)buf[i] = toupper(buf[i]);write(cfd,buf,n);}close(lfd);close(cfd);return 0;
}

client.c

2. IP段格式

3. 以太网帧

4. TCP/IP数据包

5. 打洞机制

  1. 路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包。

什么是打洞,我们假设两个扣扣A,B,他们通信需要通过腾讯的服务器。也就是A发送消息给B的话,需要通过腾讯服务器进行一次转发,才到B那里。但像视频通话这要实时性要求比较高的通信,再用这种方式就不能保证他们通信的实时性,如果能想一个办法让他们直接通信,这样实时性就会高很多。但是我们所知的路由器是有一个保护机制的(对于陌生的IP第一次发送过来的数据包,会进行屏蔽或丢弃,主要是为了防止网络的恶意攻击),A跟B想进行通信的话所携带数据包的IP就必须是熟悉的,所以说这个时候就需要在两个路由器之间打一个洞,而这件事情上腾讯就参与进来了。
简单来说在我们登入扣扣的时候,就会访问腾讯服务器,而腾讯服务器也会回一个数据包,这个数据包会携带腾讯服务器公网的IP,相对于来说服务器的公网IP在A、B那里都是熟悉的IP(就是为了防止陌生IP屏蔽),而服务器借助公网IP帮助A、B完成打洞(打洞就是实现一种通路),当它把这个洞打好以后A、B就可以实时通信。打洞是由服务器来完成的,最终的目的就是为了提高数据传输的效率。

  1. UDP打洞

所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且可获取客户端A地址和端口号。同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来的数据包后获取B的地址和端口号,将A和B的地址与端口号分别发送给对方,这样双方可以继续用UDP协议通信。这么做有什么用呢?因为对于一些应用或者需求,需要两个客户端临时做一些通信,而这种通信不需要建立tcp就可以完成,所以才去udp打洞。

  1. 公私服务器的建立

a. 公-公:直接映射
b. 公-私:NAT映射
c. 私-公:NAT映射
d. 私-私:NAT映射,打洞机制

6.Socket编程

1. 套接字原理

  1. 网络字节序采用的是大端字节流。
  2. X86平台采用的是小端存储(高位字节存储在低地址,低位字节存储在高地址)。

2. 大小端的转换

3. socket数据结构

4. ip地址转换函数


5. socket函数

6. listen函数

作用:同时,允许多少个客户端与服务端建立连接。
这个只是用来设置监听限定的,同时有多少个服务器能与其连接。

7. accept函数

  1. 返回的是一个 新的文件描述符。
  2. 如果调用完这个函数,还是没有客户端发起要与本服务端建立连接的话,就会一直阻塞。

8. connect函数

9. Socket编程流程图

10. server.c +client.c

11. 错误处理函数

1. Readn


2. Writen

3. ReadLine

参考

  1. C/C++高级编程系列(4)之Linux服务器开发三-网络编程
发布评论

评论列表 (0)

  1. 暂无评论