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无连接不可靠的数据报服务

3TCP的编程流程:

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_INETipv4

type:协议簇下具体协议,SOCK_STREAMtcp),SOCK_DGRAMudp

protocoltcp下具体协议,现在一般不用,写0

 

int bind(int sockfd, struct sockaddr *addr, int addrlen);//绑定,命名

addr:用结构体获取IP地址和端口号

 

struct sockaddr_in

{

sa_family_t sin_family; //地址簇,一般取AF_INETipv4

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阻塞的。




原创粉丝点击