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. 打洞机制
- 路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包。
什么是打洞,我们假设两个扣扣A,B,他们通信需要通过腾讯的服务器。也就是A发送消息给B的话,需要通过腾讯服务器进行一次转发,才到B那里。但像视频通话这要实时性要求比较高的通信,再用这种方式就不能保证他们通信的实时性,如果能想一个办法让他们直接通信,这样实时性就会高很多。但是我们所知的路由器是有一个保护机制的(对于陌生的IP第一次发送过来的数据包,会进行屏蔽或丢弃,主要是为了防止网络的恶意攻击),A跟B想进行通信的话所携带数据包的IP就必须是熟悉的,所以说这个时候就需要在两个路由器之间打一个洞,而这件事情上腾讯就参与进来了。
简单来说在我们登入扣扣的时候,就会访问腾讯服务器,而腾讯服务器也会回一个数据包,这个数据包会携带腾讯服务器公网的IP,相对于来说服务器的公网IP在A、B那里都是熟悉的IP(就是为了防止陌生IP屏蔽),而服务器借助公网IP帮助A、B完成打洞(打洞就是实现一种通路),当它把这个洞打好以后A、B就可以实时通信。打洞是由服务器来完成的,最终的目的就是为了提高数据传输的效率。
- UDP打洞
所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且可获取客户端A地址和端口号。同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来的数据包后获取B的地址和端口号,将A和B的地址与端口号分别发送给对方,这样双方可以继续用UDP协议通信。这么做有什么用呢?因为对于一些应用或者需求,需要两个客户端临时做一些通信,而这种通信不需要建立tcp就可以完成,所以才去udp打洞。
- 公私服务器的建立
a. 公-公:直接映射
b. 公-私:NAT映射
c. 私-公:NAT映射
d. 私-私:NAT映射,打洞机制
6.Socket编程
1. 套接字原理
- 网络字节序采用的是大端字节流。
- X86平台采用的是小端存储(高位字节存储在低地址,低位字节存储在高地址)。
2. 大小端的转换
3. socket数据结构
4. ip地址转换函数
5. socket函数
6. listen函数
作用:同时,允许多少个客户端与服务端建立连接。
这个只是用来设置监听限定的,同时有多少个服务器能与其连接。
7. accept函数
- 返回的是一个 新的文件描述符。
- 如果调用完这个函数,还是没有客户端发起要与本服务端建立连接的话,就会一直阻塞。
8. connect函数
9. Socket编程流程图
10. server.c +client.c
11. 错误处理函数
1. Readn
2. Writen
3. ReadLine
参考
- 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. 打洞机制
- 路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包。
什么是打洞,我们假设两个扣扣A,B,他们通信需要通过腾讯的服务器。也就是A发送消息给B的话,需要通过腾讯服务器进行一次转发,才到B那里。但像视频通话这要实时性要求比较高的通信,再用这种方式就不能保证他们通信的实时性,如果能想一个办法让他们直接通信,这样实时性就会高很多。但是我们所知的路由器是有一个保护机制的(对于陌生的IP第一次发送过来的数据包,会进行屏蔽或丢弃,主要是为了防止网络的恶意攻击),A跟B想进行通信的话所携带数据包的IP就必须是熟悉的,所以说这个时候就需要在两个路由器之间打一个洞,而这件事情上腾讯就参与进来了。
简单来说在我们登入扣扣的时候,就会访问腾讯服务器,而腾讯服务器也会回一个数据包,这个数据包会携带腾讯服务器公网的IP,相对于来说服务器的公网IP在A、B那里都是熟悉的IP(就是为了防止陌生IP屏蔽),而服务器借助公网IP帮助A、B完成打洞(打洞就是实现一种通路),当它把这个洞打好以后A、B就可以实时通信。打洞是由服务器来完成的,最终的目的就是为了提高数据传输的效率。
- UDP打洞
所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且可获取客户端A地址和端口号。同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来的数据包后获取B的地址和端口号,将A和B的地址与端口号分别发送给对方,这样双方可以继续用UDP协议通信。这么做有什么用呢?因为对于一些应用或者需求,需要两个客户端临时做一些通信,而这种通信不需要建立tcp就可以完成,所以才去udp打洞。
- 公私服务器的建立
a. 公-公:直接映射
b. 公-私:NAT映射
c. 私-公:NAT映射
d. 私-私:NAT映射,打洞机制
6.Socket编程
1. 套接字原理
- 网络字节序采用的是大端字节流。
- X86平台采用的是小端存储(高位字节存储在低地址,低位字节存储在高地址)。
2. 大小端的转换
3. socket数据结构
4. ip地址转换函数
5. socket函数
6. listen函数
作用:同时,允许多少个客户端与服务端建立连接。
这个只是用来设置监听限定的,同时有多少个服务器能与其连接。
7. accept函数
- 返回的是一个 新的文件描述符。
- 如果调用完这个函数,还是没有客户端发起要与本服务端建立连接的话,就会一直阻塞。
8. connect函数
9. Socket编程流程图
10. server.c +client.c
11. 错误处理函数
1. Readn
2. Writen
3. ReadLine
参考
- C/C++高级编程系列(4)之Linux服务器开发三-网络编程