网络编程
来源:互联网 发布:比较可靠的网络兼职 编辑:程序博客网 时间:2024/05/21 18:37
1.网络基础
1.1.网络工具
ping 192.168.0.26 ping某个机器在网络里通不通
ping -b ip广播地址
ifconfig -a 查看网络接口的信息
MTU最大传输单位
inet ip地址
Bcast 广播地址
had 硬件地址
lsof列出进程正在使用的文件
netstat -a 显示所有正在使用ip以及端口
-u 正在支持的是udp协议 AF_UDP
-t 正在支持的是tcp协议 AF_TCP
-x 基于unix的 AF_UNIX
-n以数字方式显示
1.2网络的基本概念
网络编程采用socket模型
网络通信的本质也是进程之间的ipc,但是是不同主机之间的进程
识别进程需要先识别主机再识别进程 sockaddr_in
识别主机:4字节整数:in_addr
IP地址 表示方法:
内部表示:4字节整数
外部表示:数点字符串表示 1.2.3.4
特点:便于记忆,但是不便于计算机识别,需要转换
识别进程:2字节整数:应用端口号 in_port_t 无符号的16字节整数
struct sockaddr_in
{
int sin_family;
struct in_addr(无符号的32字节整数) sin_addr;
in_port_in sin_port;
}
ip地址表示方法:
字符串"192.168.0.1" char *ip = "192.168.0.1" |||||||char cip[4]={192,168,0,26} char*ip = (int*)cip
整数:in_addr_t nip = 192<<24 | 168<<16|0<<8|26
字结构struct in_addr struct in_addr sip={nip};
连接点endpoint
struct sockaddr_in
{
in_port_t sin_port;
struct in_addr sin_addr;
};
1.3IP地址的转换
一系列函数:<sys/socket.h><netinet/in.h><arpa/inet.h>
inet_addr 把字符串转化为整数 网络字节序
255.255.255.255转换结果是-1,这个函数出现错误返回-1 有时有问题。。不常用
inet_aton 把字符串转化为结构体 网络字节序 常用
inet_network 把字符串转化为整数,本地字节序
字节序:高位高字节。低位低字节。。不同的系统的字节序不一样。
本地字节序:和系统有关。
网络字节序:和系统无关。
inet_ntoa 把结构体转化为字符串 常用
<>
htons(16位号)将本地字节序转化为网络字节序
1.4IP地址的意义
1.struct in_addr inet_makeaddr(int net,int host) 指定一个网络号和主机号构建ip地址
in_addr结构体
2.in_addr_t inet_lnaof(struct in_addr in) 将一个ip地址分析出主机号
3in_addr_t inet_netof(struct in_addr in) 从一个ip地址分析出网络号
1.5计算机系统中的网络配置
setup命令 配置网络
/etc/hosts文件 配置了IP,域名,主机名
/etc/protocols文件 配置系统支持的协议
/etc/services文件 存放本机支持的一些服务和他们采用的协议和端口号。应用层的。。。
函数:控制上面的文件,本地远程都可以访问。getXXXbyXXX
struct hostent gethostbyname()
struct hostent gethostbyaddr()
返回的hostent结构体里面包含一个数据项的各个内容
例子:struct hostent *ent; host结构体表示hosts文件中的一条数据项
sethostent(1) 表示打开hosts文件
while(1)
{
ent = gethostent(); 得到一条数据项
if(ent == 0) break; 如果ent指向为空 结束
printf(ent->) ent 结构体里面有很多成员 h_addr[1,2,3,4] %hhu.来打印ip地址
}
endhostent();结束打开hosts文件
2.TCP/UDP编程
模式 数据 协议
对等模型:AF_INET SOCK_DGRAM 0 用UDP
C/S模型:AF_INET SOCK_STREAM 0 用 TCP
2.0 网络编程
1.OSI7层
物理层:硬件媒介
数据链路层:数据应发往何地,怎么走
网络层:数据分不分包 传给谁
传输层:数据传递是否正确
会话层
表示层
应用层
2.程序员分为四层,程序员只关注这四层
数据链路层:传到何地(物理怎么传输,走哪条道)
网络层IP层:数据怎样传递,传给谁(传输方式,分不分包)
传输层TCP层:数据传递的状态(数据传输的结果,可靠性)
应用层:数据传递的含义,解码,两个应用明白传过来的数据的含义
编程角度:链路层:ARP层
2.1.UDP编程的数据特点:
对等模型,采用数据报文模式 AF_INET SOCK_DGRAM 0
构建socket 构建socket
绑定IP地址bind()连接目标(可选) connect()
read/recv/from发送数据write send sendto
关闭close()
recv(int s,void *buf,siez_t len,int flags)
flags=0,和read相同
recv(int s,void *buf,siez_t len,int flags,struct sockaddr *from,socklen_t *fromlen)
注释:
返回值:
注释:
值
MSG_DONTROUTE
MSG_OOB
返回值:
案例:
A:接受用户的数据并且打印数据与发送者的IP,返回一个信息过去。
B:发送数据,接收数据并且打印
A:
B:#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <stdlib.h>#include <netinet.h>int main(int argc, char *argv[]){int fd;struct sockaddr_in ad; //本机的ip地址char buf[100]; //接收数据缓冲区struct sockaddr_in ad_snd;//发送方ip地址//sockaddr_in定义的结构体存放ip地址int r;socklen_t len;//指定发送者ip的长度//构造socket**********fd = socket(AF_INET,SOCK_DGRAM,17);//udp协议采用报文格式,协议号为17 返回一个值传给fdif(fd==-1)printf("socket:&m\n"),exit(-1);printf("建立socket成功!\n");//绑定地址ad.sin_family = AF_INET;//指定地址ad.sin_port = htons(11111);//要用htons函数转换网络字节序,每个协议有默认端口,所以一般要用一万以上的端口inet_aton(&ad.sin_addr,"192.168.180.92")//将ip地址存入结构体中的ip地址项,字符串转换为接口提*********r = bind(fd,(struct sockaddr*)&ad,sizeof(ad));//把地址绑定到socket里面if(r==-1)绑定失败绑定成功while(1){len = sizeof(ad_snd)************r=recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&ad_snd,&len);//recvfrom函数if(r>0){//接受数据成功buf[r]=0;printf("发送者ip:%s,数据%s\n",inet_ntoa(ad_snd.sin_addr),buf);}if(r==0){//没有数据了。printf("关闭");close(fd);break;}if(r==-1){printf("网络故障");close(fd);break;}}}
#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <stdlib.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>int main(int argc, char *argv[]){int fd;struct sockaddr_in ad;char buf[102];//从键盘录入数据的缓冲区int r;fd = socket(F_INET,SOCK_DGRAM,0);if(fd == -1)printf(错误);ad.sin_family=AF_INET;ad.sin_port=hton(11111);ad.sin_addr.s_addr=inet_addr("192.168.180.92");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));if(r==-1) break;}close(fd);return 0;}总结:
1.问题:
connect + send +close== sendto 但sendto是每发一次连接一次,连接一次关闭一次
2.问题:
recvfrom的作用不是从指定ip接受,而是从任意ip接受数据,但主要目的是得到发送者的ip
3.问题:
为什么要bind主要目的是告诉网络发送数据的目标不是一定要绑定,只要知道你的ip和port就能发送数据
4.为什么发送者没有绑定ip和端口
底层网络驱动自动生分成ip和端口
缺陷:接收方不区分发送者,什么地方发过来的都接受。UDP的缺陷,tcp可以根据ip地址接受
2.2.TCP编程的数据特点
2.3.TCP服务器的编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- C/C++中二维数组和指针关系分析
- JavaSwing图形界面编程之画图程序
- 【Linux软件安装】Ubuntu 12.04:Arduino IDE
- iOS: Touch Demo
- Silverlight使用XmlReader读取XML数据到TreeView中
- 网络编程
- Java高级特性之跳出多重循环
- 2440触摸屏驱动程序
- JDK5.0新特性总结
- Yii中components的使用
- MySQL 复习笔记III
- John M. Pollard快速分解质因数法
- HDU 3687 National Day Parade
- Java高级特性之继承一个内部类