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

前言

正文

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值