15--linux 网络编程基础

1.基础(ip) 

     1.1 网络工具

         ping   ---- 查看网络的连接

         ifconfig -a --- 可以查看IP

         lsof  ---列出系统进程正在使用的文件

         netstat -a/-u/-t/-x/-n/-tn   ---------查看网路状态

         route      ------内核IP路由表

   1.2 网路基础概念

         网路编程采用socket模型。

         网络通信的本质是进程之间的通信。

    

        识别主机: 4个字节整数:IP地址

        识别进程: 2个字节整数:端口号


       IP地址的表示方法:

           内部表示: 4个字节整数

           外部表示: 数点字符串

      

      IP地址的转换:

      struct   sockaddr_in

       {

               int   sin_family;

               in_prot  port;

               struct   in_addr   sin_addr;

      };         

       struct   in_addr

      {

              in_addr_t   s_addr;

     };

      in_addr_t         inet_addr(   const char  *cp);       /// 把字符串转换成整数

      int                    inet_aton(   const char  *cp, struct in_addr  *inp);  ///   把字符串转换成 struct in_addr 结构体

       in_addr_t       inet_network(   const char  *cp);        把字符串转换成整数

      char *               inet_ntoa(  struct in_addr     in);           把结构体转换成字符串


   3.IP地址分为5类

A  1-126
B  128-191
C  192-223
D  224-239
E  目前还没用到,是给将来预留的!

146.35.128.1 属于B类!

1.5 计算机系统中的网络配置文件

 ————————————————

$ vi  /etc/hosts    -------配置IP,域名,主机名

$ vi  /etc/protocols  -------------配置系统支持的协议

$ vi /etc/services    -------配置服务

    

 2. TCP/UDP 编程

     对等模型: AF_INET    SOCK_DGRAM   0      .................... 报文

     C/S 模型: AF_INET   SOCK_STREAM  0      .................... 流


     2.0   网络编程

        计算机网络体系结构:

         (1) OSI的7层协议 (2) TCP/IP的四层协议(3)五层协议

            

  2.1  UDP编程的数据特点

         UDP采用对等模型SCOK_DGRAM   -------报文传输

                   socket

                    绑定IP地址  bind      连接目标(可选)

                    read/recv/recvfrom     发送数据write

                   关闭

案例:

       A.   接收用用户的数据,打印数据与发送者的IP。

       B.   发送数据,接收数据,并且打印

    

/// udpA.c  接收数据

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  // 这个头文件一定要加上,不认出现莫名的错误

main()
{
	int fd; /// socket描述符
	struct sockaddr_in ad;  // 本机IP地址
	char buf[100]; // 接收数据缓冲
	
	struct sockaddr_in  ad_snd; // 发送者的IP地址
	socklen_t len; // 发送者IP的长度
	int r; 
	
	fd = socket(AF_INET,SOCK_DGRAM,17); // 使用UDP协议
	if(fd == -1) printf("socket:%m\n"),exit(-1);
	printf("建立socket成功!\n");
	// 绑定IP
	ad.sin_family = AF_INET;
	ad.sin_port = htons(9988);
	inet_aton("120.6.20.247",&ad.sin_addr);//字符串转换成结构体
	r = bind(fd,(struct sockaddr*)&ad,sizeof(ad));
	if(r==-1) printf("bind err:%m\n"),exit(-1);
	printf("绑定地址成功!\n");
	// 读取数据
	while(1)
	{
		len = sizeof(ad_snd);
		r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&ad_snd,&len);
		if(r>0)
		{
			buf[r] = 0;
			printf("发送者IP:%s,端口:%hu,数据:%s \n",
				inet_ntoa(ad_snd.sin_addr), 
				ntohs(ad_snd.sin_port),
				buf); 
			 // char *inet_ntoa(struct in_addr in);
			 sendto(fd,"数据已经收到",strlen("数据已经收到"),0,(struct sockaddr*)&ad_snd,sizeof(ad_snd));
		}
		if(r == 0)
				printf("关闭!\n");
		if(r == -1)
		{
			printf("网络故障!\n");
			break;
		}
	}
	
}



/// udpB.c   发送数据 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

main()
{
	int fd;
	struct sockaddr_in ad;
	char buf[101];
	int r;
	
	fd = socket(AF_INET,SOCK_DGRAM,0);
	if(fd == -1) printf("socket err:%m\n"),exit(-1);
	
	ad.sin_family = AF_INET;
	ad.sin_port = htons(9988);
	ad.sin_addr.s_addr = inet_addr("120.6.20.247");
	while(1)
	{
		r = read(0,buf,sizeof(buf)-1);
		if(r <= 0) break;
		buf[r] = 0;
		r = sendto(fd,buf,r,0,(struct sockaddr*)&ad,sizeof(ad));
		bzero(buf,sizeof(buf));
		r = recv(fd,buf,sizeof(buf),0);
		buf[r]= 0;
		printf("回复的是:%s\n",buf);
		if(r==-1) break;
	}
	close(fd);
}

 截图:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值