如何连接Linux上的服务器 网络编程,Linux 网络编程 一

一、网络编程基础

网络编程本身是一门很大的学问,涉及到的东西也很多,尤其是各种协议。先看图:

bVbvSnH?w=611&h=588

正如上图所示,网络编程中包含五大层面(也有区分六个层面),从应用层到物理层可以明显看出 越往下越接近计算机硬件。自己并不是专业网络编程的工程师,所以仅对这五大层面有一点点粗浅的了解,这篇文章网络编程技巧博主写的比较详细. 平时大多数所谓网络编程,其实是在传输层、网络层方面.

二、socket编程

首先,socket(套接字)编程应该属于传输层,主要实现的是端到端的通信,非常类似于很久很久以前的固话通信,应用程序可以通过它发送或者接受数据,可以对它进行像文件似得读写、关闭等操作。套接字允许应用程序将I/O插入网络中,并与网络中的其他应用程序进行通信。

其次,网络中两台或多台主机之间进行通信,必须知道对应主机的地址,也就是其IP地址,但是只知道IP地址是远远不够的,试想如你在本机A发送了一个消息,另一个台主机B也接收到到了该消息,但是到底是B主机的哪一个进程接受并处理该消息?就像你用QQ给B发送消息,但是B不可能通过陌陌收到该消息。 因此,相互通信的主机之间还必须确定一一对应的消息处理接口--端口。端口的存在,主要是为了确认消息一一对应性。另外,端口号其实就是一个从0开始的到65535之间的一个整型数字,0~1023端口,也就是常说的静态端口,已被操作系统另做它用(http,https,ftp等各种协议占用),我们自己所能使用的端口范围只能从1024开始,即动态端口取值[1024,65535].

可是看出,若要进行网络间通信,socket至少要包含IP+port两个方面,其实事实也是如此.还是以有线电话做为类比,socket其实就是自己家中的一部电话,其中IP就是家庭地址,port就是自己家的电话号码,当要给别人打电话时,别人家当然也必须有自己的座机和专属于该座机的号码.

或许我们也能猜出,socket编程是网络编程里边必不可少且及其重要的一个环节.

三、Linux+socket实践

1、目的

熟悉Linux(这里用Ubuntu16.04版本,其他版本类似)下socket编程基本流程,掌握socket编程基本原理,搞懂Linux下socket编程所必须的函数及其用法.

实验:在本地模拟两台机器,服务器和客户端,服务器监听客户端信息并能发送广播,客户端可以主动给服务器发送消息,其中消息的输入是从标准输入设备输入,并输出到标准输出--Linux 终端.

开始之前必须了解一点 什么是文件描述符,在Unix Linux系统中,文件描述符是一个非负整数,其存在作用更像一个索引,系统内核通过该"索引"找到对应的文件、设备、外设、安装的软件等等, 并通过描述符对它们进行操作。总而言之,文件描述符对应了系统上的所有文件,这里的文件并非"传统意义上的普通文件",而是指Linux系统内核所能管理1的一切,包含文档、文件、硬件设备、系统软件等等。这也体现了Linux系统的设计思想----把一切视作文件.

2、必要接口

1)、socket函数

既然socket这么重要,来看它到底是个什么东西.在Linux终端执行:man socket,出现:

bVbvSSN?w=721&h=240

通过Linux手册查询可以知道该函数所必须的头文件,函数声明和函数描述等信息.从[DESCRIPTION]字段可知,函数创建了一个用于通信的端点并返回该端点的描述符,若创建成功,返回创建套接字的文件描述符,否则返回一负数.

函数声明 int socket(int domain,int type,int protocol);

bVbvST8?w=670&h=307

参数 domain:表示创建该socket所使用的通讯协议家族--地址族,现在一般用IPv4协议,所以通常会选择AF_INET;

参数type:指定所需的通信类型。包括数据流(SOCK_STREAM)TCP协议、数据报(SOCK-DGRAM)UDP协议和原始类型(S0CK_RAW)新网格协议的开发测试.

参数protocol:说明该套接字使用的协议族中的特定协议。如果不希望特别指定使用的协议,则置为0,使用默认的连接模式.

若要进行 基于TCP IP的网络开发测试,则函数创建方式一般为:

int listenfd = socket(AF_INET,SOCK_STREAM,0);

2)、bind函数

既然有了一部“电话”,那么就需要为该电话绑定唯一的“所属地址”,同样Linux命令行执行:man bind,同样函数声明为:

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

从手册的描述中可以看出,当成功创建socket套接字后,调用该函数可以将所创建的套接字(sockfd)和指定的地址(addr)绑定.

地址是由这样一个结构体指定:

struct sockaddr {

sa_family_t sa_family; //地址族

char sa_data[14]; //14字节的协议地址

}

上面struct sockaddr是通用地址,在网络编程中 internet sockaddr使用下面地址,两种地址可以互换:

struct sockaddr_in {

short int sin_family; /* 地址族,AF_xxx 在socket编程中只能是AF_INET */

unsigned short int sin_port; /* 端口号 (使用网络字节顺序) */

struct in_addr sin_addr; /* 存储IP地址 4字节 */

unsigned char sin_zero[8]; /* 总共8个字节,实际上没有什么用,只是为了和struct sockaddr保持一样的长度 */

};

bind()函数的第三个参数表示地址所占字节长度,socklen_t本质上是一个 unsigned int宏定义.

可以通过这样方式指定地址:

struct sockaddr_in serveraddr;

memset(&serveraddr,0,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(5188);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

//serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

首先声明网络接口地址结构,在给该地址赋值前必须将其清空.依次设置该地址的地址族、IP和端口(这里随便设置了一个),上边出现另一个新函数htons,同样终端下man htons,可知该函数的主要作用是将主机字节序转化为网络字节序,关于这两个字节序后续再深入研究.这里可以理解为:htons()的主要作用就是将十进制的ip地址和端口号转化为网络可以识别的"东东".

至此,基本可以完成座机的安装入户和号码绑定:

bing(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

3)、listen监听函数

对于我们的服务器而言,它需要监听来自客户端发来的消息,Linix终端中 man listen可以看到详细信息. 函数声明为:

int listen(int socdfd,int backlog);

其中参数sockfd代指所要监听的套接字文件描述符,参数backlog表示在套接字挂起时,所能接受请求的最大队列长度.函数执行成功返回 0,否则返回 -1.

必须说明一点,当调用该函数后,参数socdfd所指定的套接字将变为被动套接字,所谓被动套接字,是指其只能用来接收来自其他用户的链接请求. 类似于改变了套接字的状态,使其只能用于接收.

4)、accept 接收函数

对于我们的服务器而言,由于其只具备接收功能,因此必须创建一个接受函数:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

函数参数不言自明,参数1sockfd表示服务器socket描述符,参数2是指客户端的协议地址,参数3为地址长度. 函数成功返回监听的等待队列中第一个套接字的描述符.

3、服务器实现

服务器的功能是监听客户端发来的消息,并将消息广播给客户端.因此需要一个循环实时监听客户端发来的消息,在本地构建一个简单的服务器如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) \

do \

{ \

perror(m);\

exit(EXIT_FAILURE);\

}while(0)

int main(void){

int listenfd;

if(( listenfd = socket(PF_INET,SOCK_STREAM,0)) < 0){

ERR_EXIT("socket");

}

struct sockaddr_in serveraddr;

memset(&serveraddr,0,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(5188);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

//serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0)

ERR_EXIT("bind");

//一旦监听,则为被动套接字(只能接受连接,调用accep函数之前调用),这里随便给了一个最大队列长度

if(listen(listenfd,100)< 0)

ERR_EXIT("listen");

//声明一个地址,用于存储客户端链接时的协议地址

struct sockaddr_in peeraddr;

socklen_t peerlen = sizeof(peeraddr);

int conn; //返回的一个主动套接字

if((conn= accept(listenfd,(struct sockaddr*)&peeraddr,&peerlen))<0)

ERR_EXIT("accept");

char recvbuff[1024];

while(1){

memset(recvbuff,0,sizeof(recvbuff));

int ret = read(conn,recvbuff,sizeof(recvbuff));

fputs(recvbuff,stdout);

write(conn,recvbuff,ret);

}

close(listenfd);

return 0;

}

其中用到了几个非socket API的函数:

ssize_t read(int fd,void *buf,size_t count);

ssize_t write(int fd, const void *buf, size_t count);

read()函数:负责从fd所指定文件描述符读取字节大小为count的数据到buf中.若成功返回实际读取到的字节大小,否则返回负数,返回0表示读取到文件结束.

write():将buf中的count个字节内容写入文件描述符fd.成功时返回写的字节数.

4、客户端实现

客户端的实现和服务器的实现之间大同小异,同样都需要 ” 安装电话 “ ,但是客户端的功能仅在于向外”拨打电话“. 区别在于客户端是主动发起连接请求,所以它必须知道自己所要连接的目标,之后服务器才有响应.同样客户端并不需要监听,只需要接收到服务器的广播即可. 发起连接请求需要函数 connect:

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

在上述连接函数中,参数sockfd表示本机(客户端)的socket套接字描述符,参数addr表示服务器端的地址,参数3表示地址长度.

代码实现:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) \

do \

{ \

perror(m);\

exit(EXIT_FAILURE);\

}while(0)

int main(void){

int sock;

if(( sock = socket(PF_INET,SOCK_STREAM,0)) < 0){

ERR_EXIT("socket");

}

struct sockaddr_in serveraddr;

memset(&serveraddr,0,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(5188);

// serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

//发起连接

connect(sock,(struct sockadddr*)&serveraddr,sizeof(serveraddr));

char recvbuf[1024]={0};

char sendbuf[1024]={0};

while(fgets(sendbuf,sizeof(sendbuf),stdin)!= NULL){

write(sock,sendbuf,strlen(sendbuf));

read(sock,recvbuf,sizeof(recvbuf));

fputs(recvbuf,stdout);

memset(recvbuf,0,sizeof(recvbuf));

}

close(sock);

return 0;

}

上述函数功能就是从客户端主动向服务器发送连接请求,并在客户端机器的标准设备上如字符,服务器接受并返回. 实现两台机器通信的模拟.

5、结果

效果如下图:

用gcc编译上述两个文件,首先启动服务器,之后启动客户端.在客户端随便输入字符,服务器解收到并广播返回. 至此基本完成目的.

bVbvTHc?w=806&h=59

三、总结

目前来看,创建服务器的一般流程是:

1.创建socket套接字(`socket`函数);

2.创建服务器地址,地址包含协议族、IP和端口号(`const struct sockaddr*`);

3.绑定套接字和服务器地址(bind函数);

4.系统监听服务器,一旦监听则该套接字变为被动套接字,只能用于接收数据(`listen`函数);

5.作为服务器,应该能接收客户端信息(`accept`函数),该函数返回一个主动套接字;

基于以上步骤,基本能搭建一个简单的服务器.

客户端的搭建相比而言简单许多:

1.创建用于连接的套接字;

2.将套接字和服务器地址连接;

3.发送消息

网络编程毕竟浪大水深,毕竟初涉,慢慢填充.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑练习打字软件_Type Fu for Mac 4.5.7 共享版 – 优秀的键盘打字练习软件

下载地址&#xff1a;图片中有地址系统兼容性&#xff1a;OS X 10.10或更高版本&#xff0c;64位处理器Type Fu 教您如何在不看键盘的情况下加快打字速度&#xff0c;从而提高您的打字技巧。Type Fu 功能特点&#xff1a;通用。该应用程序适合所有年龄段和技能水平。您可以是初…

access如何保存小数点后_如何把示波器当记录仪用

波形记录仪能长时间的采集信号&#xff0c;并将数据保存到设备的硬盘中&#xff0c;采集的时间长度取决于采样率以及硬盘容量&#xff0c;但和示波器相比&#xff0c;它不具备实时分析的功能&#xff0c;而这正好是示波器的强项。示波器能在长时间采集波形的同时&#xff0c;对…

完全相同的4个小矩形如图所示放置_分享 | 你想知道的100个桥梁知识点!

1、组合梁桥composite beam bridge指以梁式桥跨作为基本结构的组合结构桥&#xff0c;既两种以上体系重叠后&#xff0c;整体结构的反力性质仍与以受弯作用负载的梁的特点相同。这类桥的特点主要表现在设计计算工作繁重&#xff0c;构造细节及内力复杂。2、空腹拱桥open spandr…

4am永远 鼠标按键设置_4AM碾压性夺冠创PCL历史!韦神赛后采访彰显霸气

《绝地求生》PCL秋季赛的战斗已经全部落下帷幕了&#xff0c;Team Razer 雷蛇战队成员&#xff0c;国内最具人气的4AM战队凭借着在季后赛的出色发挥&#xff0c;以316分的高分碾压全场&#xff0c;成功斩获本次PCL秋季赛的冠军&#xff0c;成为PCL联赛首个双冠队伍。随着金色的…

angular项目打包_vue项目部署的最佳实践

作者&#xff1a;沉末_https://juejin.im/post/5eb2243e51882555d8457833前 言 使用vue、react、angular等技术开发过程中&#xff0c;我们都会遇到以下问题&#xff1a;首屏加载慢&#xff1b;每一次更新都需要清除浏览器缓存才能看到效果(经常被测试吐槽)。这两个问题可以从很…

run as date怎么用_熟词僻义 | date是一种什么水果?

今天小站来和各位聊聊date这个熟词。说起date&#xff0c;这可是工作生活中一个极其常用的单词。无论是为下次工作会议定个日期&#xff0c;还是为即将举行的婚礼定个日子&#xff0c;都可以用“fix/set a date for sth”来表示。在沃尔玛等超市购物&#xff0c;经常可以看到食…

Macbook Pro 201 装Win10 声卡_苹果电脑真那么耐用吗?我拿五年前的Mac试了试-苹果,MacBook ——快科技(驱动之家旗下媒体)-...

平时对电脑关注比较多的小伙伴们应该知道&#xff0c;一直以来&#xff0c;同样硬件配置下的苹果电脑通常会比其它品牌的笔记本电脑要贵上不少。别问( 为什么 )&#xff0c;问就是它做工优秀、经久耐用。话虽然是这么说没错&#xff0c;但托尼仔细想想网上这个说法好像又有点问…

linux一个vlan配置多个端口映射,Linux 设置 多ip,多vlan

引:在Linux下有时候需要给一个网卡绑定多个IP&#xff0c;本文介绍在Redhat系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法。在Linux下有时候需要给一个网卡绑定多个IP&#xff0c;本文介绍在Redhat系列(redhat,Fedora Core,Centos)中…

teamviewer一直验证账户_苹果手机下载软件一直需要验证

用过苹果手机的朋友可能都会遇到一种情况&#xff0c;那就是在App Store下载应用的时候&#xff0c;偶尔会弹出需要验证手机的窗口&#xff0c;但是我们按照系统要求给绑定的手机号发送了短信以后却没有任何反应了&#xff0c;遇到这种情况应该如何解决呢&#xff1f;接下来我就…

200 switching to ascii mode_【图片】15005377957 三轮车载式液压打井机XYC-200A 型深水井钻机游走乡【地勘吧】...

巨匠集团长期坚持以客户为基本&#xff0c;不断采纳客户所提出的意见和建议&#xff0c;不断更新自己的产品&#xff0c;让您用到质量过硬&#xff0c;操作简单的产品。巨匠集团&#xff0c;坚持做您身边的钻机帮手。一、XYC-200A三轮车载水井钻机适应范围地质普查勘探&#xf…

c++用一级运算比较大小_16.初中数学:怎么比较a、b、c、d的大小?幂的运算,基础常见考题...

欢迎您来到方老师数学课堂&#xff0c;请点击上方蓝色字体&#xff0c;关注方老师数学课堂。所有的视频内容&#xff0c;全部免费&#xff0c;请大家放心关注&#xff0c;放心订阅。初中数学&#xff1a;怎么比较a、b、c、d的大小&#xff1f;幂的运算&#xff0c;基础常见考题…

php 谷歌翻译api_武汉武昌区地质勘测翻译公司-译嘉合翻译

Angie就结合自己的经验来给大家谈谈如何构建自己的翻译领域吧&#xff0c;相信不管是刚入门急于寻找翻译赛道的新手&#xff0c;还是希望在原有基础上拓宽翻译领域、获得更多合作机会的译员都能带来帮助。地质勘测翻译公司" />鉴于你非英语或翻译专业&#xff0c;要直接…

建立a8 linux开发环境,Fedora 14下建立 omap3530 开发环境 - 交叉编译器

主机升级到Fedora 14&#xff0c;下载了crosstool-ng-1.10.0&#xff0c;编译目标为 arm-cortex_a8编译步骤&#xff1a;1、直接拷贝 crosstool-ng-1.10.0/samples/arm-cortex_a8-linux-gnueabi/crosstool.config 到目标目录中的 .config2、执行 ct-ng menuconfig 查看和校验编…

arm b bl 地址无关码_32位和64位下的arm_pwn初探

32位和64位下的arm_pwn初探前言&#xff1a;pwn的学习之路一直在进行&#xff0c;今天看了arm_pwn&#xff0c;搞环境就搞了半天&#xff0c;琢磨工具使用到做题&#xff0c;这里总结下&#xff0c;希望能帮助到大家&#xff0c;少走一点弯路&#xff0c;后期有机会继续更新。一…

如何用unit test测试controller_如何用电缆故障测试仪冲闪测试确定故障点?

原标题&#xff1a;如何用电缆故障测试仪冲闪测试确定故障点&#xff1f;当我们中试控股在使用电缆故障测试仪检测电缆故障时&#xff0c;遇到故障点二次击穿放电时&#xff0c;其波形要如何分析&#xff1f;首先我们要知道仪器在遇到故障点二次击穿时的表现是怎样的。显示故障…

linux下qt环境的运行,在Linux下使用QT环境来安装和运行WebKit

Installing and Running WebKit in Linux Using QtI’mcoming to appreciate more and more all of the hard work softwaredevelopers perform. I wouldn’t consider myself an open source elitist,but there’s something special about the associated ideologies. When a…

button 样式_缩减 SCSS 50%样式代码的 14 条实战经验

原标题&#xff1a;缩减 SCSS 50%样式代码的 14 条实战经验作者&#xff1a;feishi123前言Sass是CSS3语言的扩展&#xff0c;它能帮你更省事地写出更好的样式表&#xff0c;使你摆脱重复劳动&#xff0c;使工作更有创造性。因为你能更快地拥抱变化&#xff0c;你也将敢于在设计…

神舟电脑装linux双系统,个人windows10和Ubuntu18.04游戏笔记本uefi双磁盘双系统安装过程...

此文章为记录自己的Ubuntu的安装和使用过程本人电脑是128G固态500G机械。固态中装的是windows10&#xff0c;这次决定在机械中安装Ubuntu。虽然网上教程很多&#xff0c;但是我仍然是在参考了多个教程后才动手安装&#xff0c;于是记录自己的安装过程。该机器是神舟Z6-sl7d1,系…

请解释自动装配模式的区别?_如何从齿条优化方面有效节约机床装配时间

齿条&#xff1a;螺纹连接的设计和计算是否正确&#xff1f;如果我们真的想要节约装配成本和时间的话&#xff0c;那么我们首先就需要去选择设计正确的齿条螺钉。那么这时候就紧接着产生了第二个问题&#xff1a;我们应该如何评估并优化这种设计。当我们去观察比较齿轮和齿条这…

仓库处理中 无法修改_临沂用友U8erp系统软件如何新增仓库?

存货一般是用仓库来保管的&#xff0c;对存货进行核算管理&#xff0c;首先应对仓库进行管理&#xff0c;因此进行仓库设置是供销链管理系统的重要基础准备工作之一。第一次使用本系统时&#xff0c;应先将本单位使用的仓库&#xff0c;预先输入到系统之中&#xff0c;即进行&q…