Linux——网络编程基础(一)——内存管理&网络基础
来源:互联网 发布:webstorm格式化js代码 编辑:程序博客网 时间:2024/05/29 18:08
(一)内存管理:
内存管理方式:
分区:
伙伴系统:
分页:
分段:
端页式:
(二)Linux网络编程基础:
1、什么是网络,什么是互联网,网络的功能
网络:将主机连接起来称之为网络
网络设备:路由器交换机
线路:双绞线(传递距离 100 米)
同轴电缆
光纤
无线
计算机:手机电脑服务器
互联网:将网络连接起来就称之为互联网。最大的互联网: inter 网
网络的功能:资源共享,信息交换
2、网络通信的两个主角:进程和进程,
IP:标示出网络上的电脑
MAC地址:网卡地址,主机地址
端口号:
3、网络分层 : OSI模型和 Tcp/ip协议分层方式
OSI模型:
应用层表示层会话层传输层网络层数据链路层物理层
TCP/IP模型:
应用层传输层网络层数据链路层
4、协议的概念:网络各层包含的基本协议和功能 (arp, ip ,tcp ,udp,http)
(1)数据链路层:
ARP协议(Address Resolve Protocol,地址解析协议),
RARP(Reverse Address Resolve Protocol,逆地址解析协议)
(2)网络层:选路存储转发
IP协议(Internet Protocol,因特网协议),
ICMP协议(Internet Control Message Protocol,因特网控制报文协议)
(3)传输层:端到端的通信
TCP协议(Transmission Control Protocol,传输控制协议),
UDP(User Datagram Protocol,用户数据报协议)
SCTP(Stream Control Transmission Protocol,流控制传输协议)
(4)应用层:
ping是应用程序,不是协议。
telnet:
http (超文本传输协议),ftp(文件传输协议)
网络数据传递流程
1、怎样完成网络编程:
服务器:提供数据的为服务器
客户端:获取数据的为客户端
2、协议的选择:
TCP:面向连接的可靠的流式服务
UDP:无连接不可靠的数据报服务
3、TCP的编程流程:
server: socket bind listen accept recv/send close
client: socket /*bind*/ connect recv/send close
下面来说几个函数:
int socket(int domain, int type, int protocol);//套接字,文件描述符
domain:协议簇,一般写AF_INET(ipv4)
type:协议簇下具体协议,SOCK_STREAM(tcp),SOCK_DGRAM(udp)
protocol:tcp下具体协议,现在一般不用,写0
int bind(int sockfd, struct sockaddr *addr, int addrlen);//绑定,命名
addr:用结构体获取IP地址和端口号
struct sockaddr_in
{
sa_family_t sin_family; //地址簇,一般取AF_INET(ipv4)
u_int16_t sin_port; //端口号,网络字节序(大端模式) PC机(小端模式)
struct in_addr sin_addr; // IP地址
}
Struct in_addr
{
u_int32_t s_addr; // IP地址最终的表示
}
int listen(intsockfd, int size);//监听
int accept(intsockfd, struct sockaddr *addr, int *addrlen);
返回值:获取到的和客户端连接的文件描述符
Addr:记录客户端的IP地址和端口号
int connect(int sockfd, struct sockaddr* addr, int addrlen);
addr:要连接的服务器的IP地址和端口号
netstat -atp显示本机上所有的 TCP服务程序以及其占用的端口号
下面写一个TCP的编程,
ser.c:服务器端
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>void main(){int sockfd = socket(AF_INET,SOCK_STREAM,0);assert(sockfd != -1);struct sockaddr_in ser,cli;ser.sin_family = AF_INET;ser.sin_port = htons(6000);ser.sin_addr.s_addr = inet_addr("127.0.0.1");int res = bind(sockfd, (struct sockaddr*)&ser, sizeof(ser));assert(res != -1);listen(sockfd, 5);printf("listen over\n");while(1){int len = sizeof(cli);int c = accept(sockfd, (struct sockaddr*)&cli, &len);assert(c != -1);char buff[128] = {0};recv(c,buff,127,0);printf("recv: %s\n",buff);send(c,"I konw",sizeof("I know"),0);close(c);//关闭链接}close(sockfd);//关闭文件监听描述符}
cli.c:客户端
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>void main(){int sockfd = socket(AF_INET, SOCK_STREAM, 0);assert(sockfd != -1);struct sockaddr_in ser, cli;ser.sin_family = AF_INET;ser.sin_port = htons(6000);ser.sin_addr.s_addr = inet_addr("127.0.0.1");int res = connect(sockfd, (struct sockaddr*)&ser, sizeof(ser));assert(res != -1);send(sockfd, "hello world", strlen(" hello world"), 0);char buff[128] = {0};recv(sockfd, buff, 127, 0);printf("recv: %s\n",buff);close(sockfd);}
执行结果:加入while循环后,服务器端可以循环接收用户端输入,在litsten后面打印标记,说明在listen处没有阻塞,在后面阻塞的,也就是accept阻塞的。
- Linux——网络编程基础(一)——内存管理&网络基础
- Java基础—网络编程(一)
- Java基础—网络编程(一)
- 嵌入式 Linux网络编程(一)——Socket网络编程基础
- linux 基础 —— 网络管理
- 网络编程基础(一)——使用TCP
- Java基础——网络编程(一)
- Linux网络编程基础(一)
- Linux网络编程基础(一)
- Java基础—网络编程
- Linux——网络编程基础(二)
- Linux网络编程基础(一)
- linux网络编程基础(一)
- linux网络编程基础(一)
- Linux网络编程(一)基础
- linux网络编程基础(一)
- 《Linux网络编程》学习笔记(1)——Linux网络开发基础:Linux操作系统概述
- linux网络编程(6)——TCP网络编程基础
- 11.02周四
- sublime 常用配置 快捷键等
- elk环境搭建
- simple.data 数据库修改数据
- PAT 乙级练习 1002
- Linux——网络编程基础(一)——内存管理&网络基础
- Strange fuction HDU
- python笔试题汇总
- LeetCode.349(350) Intersection of Two Arrays && II
- js
- 练习11.2
- OHUI v42 for Android
- with语句的使用
- POJ 3414