当前位置: 主页 > 电脑系统维修 > Linux网络编程一站式进修

Linux网络编程一站式进修

发布时间:12-18 05:54点击:

  是基于TCP/IP的网络使用编程中运用的相关数据通讯的概念,一般也称作套接字,用来形容IP地点和端口,是一度通讯链的句柄。正在Internet上的长机正常运转了多个服务硬件,同声需要多少种服务。每种服务都翻开一度Socket,并绑定到一度端口上,没有同的端口对于应于没有同的服务。Socket正如果英文原意这样,像一度多孔插座。一台长机犹如布满各族插座的房间,每个插座有一度编号,部分插座需要220伏交换电, 部分需要110伏交换电,部分则需要电视机目录。 存户硬件将插销插到没有同编号的插座,就能够失去没有同的服务。

  凭借某个图,咱们能够很明晰地把socket的一些接口和TCP/IP中装务器和存户端形态转换的对于应联系。

  预备形态

  服务器调用socket()、bind()、listen()实现初始化后,调用accept()堵塞期待,在于端口的形态,存户端调用socket()初始化后,调用connect()收回SYN段并堵塞期待服务器应对于,服务器应对于一度SYN-ACK段,存户端收到后从connect()前往,同声应对于一度ACK段,服务器收到后从accept()前往。

  数据传输的进程

  构建联接后,TCP协定需要全双工的通服气务,然而正常的存户端/服务器顺序的流水线是由存户端自动发动要求,服务器主动解决要求,一问一答的形式。因而,服务器从accept()前往后立即调用read(),读socket就像读弹道一样,假如没无数据抵达就堵塞期待,那时存户端调用write()发送要求给服务器,服务器收到后从read()前往,对于存户端的要求停止解决,正在这时期存户端调用read()堵塞期待服务器的应对于,服务器调用write()将解决后果发回给存户端,再次调用read()堵塞期待下一条要求,存户端收到后从read()前往,发送下一条要求,如此重复上去。

  假如存户端没有更多的要求了,就调用close()开放联接,就像写端开放的弹道一样,服务器的read()前往0,那样服务器就晓得存户端开放了联接,也调用close()开放联接。留意,任何一方调用close()后,联接的两个传输位置都开放,没有能再发送数据了。假如一方调用shutdown()则联接在于半开放形态,仍可吸收对于方寄送的数据。

  正在进修socket API时要留意使用顺序和TCP协定层是如何交互的: 使用顺序调用这个socket因变量时TCP协定层实现什么举措,比方调用connect()会收回SYN段 使用顺序如何晓得TCP协定层的形态变迁,比方从这个堵塞的socket因变量前往就标明TCP协定收到了某些段,再比方read()前往0就标明收到了FIN段。

  socket()翻开一度网络通信端口,假如顺利的话,就像open()一样前往一度资料形容符,使用顺序能够像读写资料一样用read/write正在网络上收发数据,假如socket()调用出错则前往-1。关于IPv4,mily参数指名为AF_INET。关于TCP协定,type参数指名为SOCK_STREAM,示意面临流的传输协定。

  25-28行,率先将整个构造体清零,而后安装地点类型为AF_INET,网络地点为INADDR_ANY,某个宏示意外地的恣意IP地点,由于服务器能够有多个网卡,每个网卡也能够绑定多个IP地点,那样安装能够正在一切的IP地点上,直到与这个存户端构建了联接时才肯定上去究竟用哪个IP地点,端标语为SERV_PORT,咱们界说为8000。

  30行,调用bind绑定一度流动的网络地点和端标语。bind()顺利前往0,失利前往-1。因变量原型:

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

  bind()的作用是将参数sockfd和myaddr绑定正在一同,使sockfd某个用来网络通信的资料形容符myaddr所形容的地点和端标语。

  32行,申明listenfd在于形态,况且至多答应有20个存户端在于联接待形态,假如吸收到更多的联接要求就疏忽。listen()顺利前往0,失利前往-1。

  25-49行,整个是一度while死重复,历次重复解决一度存户端联接。因为cliaddr_len是传入传出参数,历次调用accept()事先该当从新赋初值。accept()的参数listenfd是以前的资料形容符,而accept()的前往值是此外一度资料形容符connfd,以后与存户端之间就经过某个connfd通信,最初开放connfd割断联接,而没有开放listenfd,再次回到重复扫尾listenfd依然用作accept的参数。accept()顺利前往一度资料形容符,出错前往-1。

  存户端少了bind,多了个connect因变量。因为存户端没有需求流动的端标语,因而无须调用bind(),存户端的端标语由内核主动调配。留意,存户端没有是没有答应调用bind(),但是没有多余调用bind()流动一度端标语,服务器也没有是必需调用bind(),但假如服务器没有调用bind(),内核会主动给服务器调配端口,历次发动服务器时端标语都没有一样,存户端要联接服务器就会遇到费事。connect因变量原型:

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

  先按上面的方法做:

  1.终端输出ifconfig,检查本人的ip地点;

  2.运转意译好的server顺序;

  3.正在阅读器的地点栏外面输出:X.X.X.X:80

  (X.X.X.X是你的ip地点)

  失去阅读器的运转后果是

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
电脑维修