linux execl()函数 关于execl()函数族的用法不在赘述,
linux execl()函数 关于execl()函数族的用法不在赘述,
1.TCP和UDP协议
共同点:同为传输层协议
不同点: TCP:有连接,可靠
UPD 无连接,不保证可靠
TCP(即传输控制协议):
是一种面向连接的传输层协议,它是能提供高可靠性通信(即,数据无误,数据无丢失,数据无失序、数据无重复到达的通信)
适用情况:
适合于对传输质量要求较高,以及传输大量数据的通信。
在需要可靠数据传输的场合,通常使用TCP协议
QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
UDP(User Datagram Protocol)用户数据报协议
是不可靠的无连接协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
使用情况:
发送小尺寸数据(如对DNS服务器进行IP地址查询时)
在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
适合于广播、组播式通信中。
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
流媒体、VOD/VoIP/IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输。
2.socket
是一个编程接口
是一种特殊的文件描述符(everything in Unix is a file)
并不仅限于TCP/IP协议
面向连接(Transmission Control Protocol Protocol -TCP/IP)
无连接(User Datagram Protocol -UDP 和 Inter-network Packet Exchange -IPX)
Socket类型:
流式套接字(SOCK_STREAM)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看做是字节流,无长度限制。(TCP)
数据报套接字(SOCK_DGRAM)
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收(UDP)
原始套接字(SOCK_RAM)
可以对较低层次协议如IP、ICMP直接访问。(如 Ping )
3.IP地址
IP地址是Internet 中主机的标识
IP地址为32位(IPv4)或者128位(IPv6)
ipv4表示形式:点分十进制,例如:192.168.1.123
IP地址分类(根据ipv4前八位来区分):
A类 0000 0000 - 0111 1111 0.x.x.x - 127.x.x.x
B类 1000 0000 - 1011 1111 128.x.x.x - 191.x.x.x
C类 1100 0000 - 1101 1111 192.x.x.x - 223.x.x.x
D类 1110 0000 - 1110 1111 224.x.x.x - 239.x.x.x 组播地址
E类 1111 0000 - 1111 1111 240.x.x.x - 255.x.x.x 保留测试
192.168.x.x 属于局域网Ip地址,可以砸任意一个ip地址下使用路由器分配地址
以192.168.1.x为例:
192.168.1.255 广播地址
192.168.1.0 表示网络号
192.168.1.1 表示网关
127.x.x.x 属于本机地址
子网掩码:可以用于得到当前最大的主机连接数
A类:255.0.0.0 0~24
B类:255.255.0.0 2~16
C类:255.255.255.0 2~8
#include<arpa/inet.h>
将点分十进制ip地址转化为网络字节序的整形数据
in_addr_t inet_addr(const char *cp);
将网络字节序的整形数据转化为点分十进制ip地址
char * inet_ntoa(struct in_addr in);
例子:
inet_addr("192.168.1.123");
4.端口号
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
TCP端口号与UDP端口号独立
端口号一般由IANA(Internet Assigned Numbers Authority) 管理
众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151
动态或私有端口:49152~65535
使用 vi /etc/services 可以查看已经使用的端口号
一般使用 5555、6666、7777、8888、9999、10001、10000
5.字节序
不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
小端序(little-endian)
低序字节存储在低地址,将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)
高序字节存储在低地址,将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
如何测试主机字节序:
方法1:使用指针
方法2:使用file命令, file a.out,其中LSB的L为小端存储
方法3:使用共用体
网络字节序:大端存储
主机字节序和网络字节序转换接口:
#include <arpa/inet.h>
将主机字节序转化为网络字节序
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
将网络字节序转化为主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
例子:
htons(9999);
流程
服务器:server
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
将套接字与服务器网络信息结构体绑定 bind( )
将套接字设置为被动监听状态 listen( )
阻塞等待客户端的连接请求 accept( )
进行通信 recv( )/send( ) 或 read( )/write( )
客户端:client
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
发送客户端的连接请求 connect( )
进行通信 recv( )/send( ) 或 read( )/write( )
1,io模型:
阻塞io、非阻塞io、io多路复用,信号驱动io。
阻塞Io与非阻塞io的转换,可用fcntl()函数
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd,int cmd,...);
2,io多路复用
在应用程序中同时处理多路输入输出流
若采用阻塞模式,将得不到预期的目的
若采用非阻塞模式,对多个输入进行轮询,则浪费CPU资源
若设置多个进程,分别处理一条数据通路,将新产生进程间的同步与通信问题
使得程序变得过于复杂。
这时,比较好的方法是使用IO多路复用,其基本思想是:
先构造一张有关描述符的表,然后调用一个函数。
当这些文件描述符中的一个或多个已准备好进行IO函数时,函数才返回
函数返回时,高诉进程哪个描述符已经就绪,可以进行IO操作。
使用IO多路复用时,主要用到以下函数(LINUX)
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set * exceptfds,struct timeval * timeout);
void FD_ZERO(fd_set *set);
void FD_SET(int fd,fd_set *set);
void FD_CLR(int fd,fd_set *set);
int FD_ISSET(int fd,fd_set *set);
莫做伸手党。
3,实现TCP并发服务器
方法一:通过使用父子进程实现tcp并发服务器
方法二:使用select函数实现tcp并发服务器
法一:
socket();
sockaddr_in;
bind();
listen();
while(1)
{
accept();
pid = fork();
if(pid > 0){}父进程负责连接
else if(pid == 0){
while(1)
{
recv()/send();
}
}
}
这里有个难点:一个客户端退出后,如何避免对应的“服务器”进程,编程僵尸进程?
解决办法是:采用信号,来回收客户端对应“服务器的资源”。
法二:笔者也在琢磨。。。。。。
关于execl()函数族的用法不在赘述。下面说下作者在使用该函数时所犯的错误:
作者想通过使用execl()函数在子进程中调用其他函数,起初楼主是 这样用的:
if((a = execl("~/linux_io/3/3.2/3.2.1/2/hello","hello",NULL)) < 0)
{
perror("error:");
}
结果一直提示找不到文件,最后发现它不识别~号。。。。。。。。
改为:/home/linux/linux_io/3/3.2/3.2.1/2/hello 才对
linux execl()函数 关于execl()函数族的用法不在赘述,的更多相关文章
- linux execl()函数
关于execl()函数族的用法不在赘述,其他博主介绍的很详细.下面说下作者在使用该函数时所犯的错误: 作者想通过使用execl()函数在子进程中调用其他函数,起初楼主是 这样用的: if((a = e ...
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- vlookup函数使用---execl公式
目录 vlookup函数使用---execl公式 1.用途: 2.函数语法: 3.使用方式: 4.实际案例+步骤解析 5.常见错误 vlookup函数使用---execl公式 1.用途: 我们有一张工 ...
- [国嵌攻略][070-095][Linux编程函数手册]
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...
- linux系统调用函数---12
Linux应用编程学习笔记 周学伟 一.系统调用文件编程 1.文件打开函数 /*************************** ...
- linux select函数详解
linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
- linux select函数:Linux下select函数的使用详解【转】
本文转载自;http://www.bkjia.com/article/28216.html Linux下select函数的使用 Linux下select函数的使用 一.Select 函数详细介绍 Se ...
随机推荐
- 【Android TimeCat】 解决cannot resolve symbol R
莫名其妙出现了,鬼知道怎么来的. 解决方法总结 1. 推荐 解决90%的情况: Build->Clean ProjectBuild->Rebuild Project 2. 不常见 Andr ...
- 通过pl/sql连接远程Oracle数据库
通过PL/SQL连接远程数据库,简单的方式就是安装Oracle客户端,还有一种方式就是不安装客户端,但是需要自己创建必要的配置文件,下面主要对安装客户端的过程简单做一下记录. 网上一个不安装客户端的教 ...
- C++扬帆远航——3(打印图形)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:tuxing.cpp * 作者:常轩 * 完成日期:2016年3 ...
- 解决WebMvcConfigurer下的addViewControllers无法找到制定页面
解决WebMvcConfigurer下的addViewControllers无法找到制定页面 这种都已经配置了拦截跳转,但无效的原因是,没有加载thymeleaf依赖 <dependency&g ...
- 关于css 的垂直居中
对于元素的水平居中,我根据我自己之前的一些学习来进行一些总结,如果有不对的地方,欢迎指正~ 一.让大小不固定的元素垂直居中 因为:表格的单元格的特别属性:垂直居中等: `div.parent { di ...
- echarts实现饼图及横向柱状图的绘制
项目中需要绘制饼图,因此简单学习了下echarts的基本使用.head中引入js文件: <script src="/static/frame/echarts/echarts.min.j ...
- .Net Core WebApi在Linux上启动和关闭
测试机器:阿里云云主机1核2g 安装环境:centos-7 服务器:Nginx 1.17.1 测试默认已启动 已安装配置:.Net Core 3.1 测试默认安装 连接配置:x-ftp,x-shell ...
- new Date在IOS下面的兼容问题
此问题坑爹啊,着实坑爹,要不是本宝宝鬼机灵再次进行了测试,不然测试都测不出来的问题,问题源头,有两个时间: let start = "2018-08-08 00:00:00" ; ...
- idea最下方视图中没有spring框解决方法
之前遇到过idea打开一个项目后,如图所示的spring视图框消失不见了. 并且view-Tool windows里面也找不到的问题;因为没有这个的话还挺烦的,网上搜了好久都没有资料,所以记录一下; ...
- 什么是phpMyAdmin
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此Web接口可以成为一个简易方式输入繁杂 ...