linux tcp

Linux的网络命令: 
ifconfig   ->查看当前的网络IP地址  

ifconfig xxx  192.168.13.yyy  //设置xxx的网卡设备的IP为 yyy

ping  192.168.13.xxx  //测试本地的IP与对方的xxx是否能接通
--------------假设与别人的MAC一致的话则需要修改一下-----------------
ifconfig eth0 down
ifconfig eth0 hw ether 00:0C:18:EF:FF:ED
ifconfig eth0 up 
子网: 路由器分下网络    (局域网)
公网: 运营商里面的网络  (英特网)
IP地址的分类:  
A 类 0.0.0.0127.255.255.255  
B 类 128.0.0.0191.255.255.255  
C 类 192.0.0.0223.255.255.255  
D 类 224.0.0.0239.255.255.255 
E 类 240.0.0.0247.255.255.255  

例如: 192.168.13.XXX  ->网段号   
				 xxx  ->该网段的主机号
		
0 IP不可用  
1 IP一般用做路由的网关 (不可用)
255 IP是用来做该网段的广播地址 (不可用的)

C类的可以用主机号为: 2 - 254 
网络的分层模型:
OSI七层模型: 
应用层
表示层
会话层   -> 应用层

-------------------------
传输层
网络层

--------------------------
数据链路层
物理层   ->物理层

---------------------------
简化的4层模型: 
应用层
传输层
网络层
物理层
传输层:TCP 协议  UDP 协议 

TCP协议:TCP传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。 (传输速度慢,网络会阻塞,用于控制指令,与文件的传输,每次数据的交互都以一个字节为单位的)
										
UDP协议:UDP数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 
	    (传输速度快,网络不会阻塞,只会丢失数据,多用于多媒体数据传输(视频,音频。。))
TCP的搭建步骤: 
服务器端: 
1.创建socket  
2.绑定地址  bind 
3.监听绑定的地址 listen
4.接收请求  accept
5.进行通信  read/write 
6.关闭通信  close  

客户端: 
1.创建socket
2.链接服务器  connect 
3.进行通信     read/write 
4.关闭通信	close

UDP的搭建步骤: 
服务器端: 
1.创建socket
2.绑定socket 
3.接收(recvfrom  )或发送(sendto)    				
4.关闭通信

客户端:
1.创建socket
2.接收(recvfrom)或发送(sendto)      						 
3.关闭通信
---------------------------------linux系统网络编程之TCP客户端的搭建流程-----------------------------------
1.创建socket   
man 2  socket 查看函数的原型和头文件

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
	参数一:协议族 (网络层的协议)
			AF_INET -》 IPV4协议   (一般使用V4)
			AF_INET6 -》 IPV6协议 
			AF_LOCAL -》 本地默认协议
	参数二:传输协议 SOCK_STREAM  ->数据流协议  TCP  
				  SOCK_DGRAM   ->数据报协议  UDP 
					 
	参数三:属性  默认  0 
	返回值:成功: 返回新创建的套接字的描述符
			失败: 返回-1 


2.链接服务器 
NAME
       connect - initiate a connection on a socket
				 初始化一个网络通信socket  
SYNOPSIS
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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

//参数一:需要初始化的socket描述符   
//参数二:服务器的IP地址信息   (已经在监听的服务器地址)
//参数三:服务器信息的大小    (sizeof(struct sockaddr))
 返回值: 成功 0 
		 失败 -1

重点!!!!!!服务器信息的设置:  
struct sockaddr *addr -> struct结构体 


通用地址结构
  struct sockaddr
  {    
       u_short  sa_family;    // 地址族, AF_xxx
       char  sa_data[14];     // 14字节协议地址  (把IP地址与端口号都放到一起了)
  };

  
新型的IP地址结构体: 
查看新型的结构体信息: 
gedit  /usr/include/linux/in.h 

struct sockaddr_in {
  __kernel_sa_family_t	sin_family;	/*地址族,IP协议*/  默认:AF_INET
  __be16		sin_port;			/*端口号*/
  struct in_addr	sin_addr;	    /*网络IP地址*/


  unsigned char		__pad //8位的预留接口
};

---------------------------------------
//端口号 ????__be16 -》unsigned short 整形 
端口号是用来区分数据发送给电脑中的哪一个网络应用程序,
他的取值范围是 0-> 65535 当然我们在使用的时候必须要注意如下: 

1~1024一般是系统进程已经使用了,所以用户使用的话最好在1025 ~ 65535 之间

-----------------------------------------
//IP地址
struct in_addr	sin_addr

/* Internet address. */
struct in_addr {
	__be32	s_addr;
};
__be32 -32位的整形数据   


把点分十进制的IP地址转换成整形
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//把字符串的IP变成 整形IP
in_addr_t inet_addr(const char *cp);

//把整形IP变成字符串类型
char *inet_ntoa(struct in_addr in);

 
//网络通信都使用大端格式  
 #include <arpa/inet.h>	
 uint16_t htons(uint16_t hostshort); //把数据转换成大端格式(把本地序转换成网络序)
 uint16_t ntohs(uint16_t netshort);//把数据转换成小端格式(把网络序转换成本地序)	
服务器端的搭建步骤: 
1.创建socket  (同上)

2.绑定服务器的IP地址信息   (在路由上注册,IP与对应的端口)
#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
参数一:socket描述符
参数二:服务器的IP地址信息 
参数三:服务器的IP地址信息的大小
返回值: 成功返回0,否则返回-1

作为服务器的时候:我们可以使用系统定义的万能IP:0.0.0.0 或 INADDR_ANY 宏
				使用万能IP后,系统就会自动检测本地网卡的IP地址进行绑定!!
					  
/* Address to accept any incoming messages. */
#define	INADDR_ANY		((unsigned long int) 0x00000000)


3.设置为监听模式
#include <sys/socket.h>

int listen(int s, int backlog);
参数一:需要设置的socket描述符 
参数二: 最大的监听数  (同时可以接受多少个连接请求)
返回值:成功时返回0.错误时返回-1,

			
4.接受客户端的链接请求!!  
 #include <sys/types.h>
 #include <sys/socket.h>
 
 int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
参数一:监听模式下socket描述符
参数二:保存对方的IP地址信息 
参数三:成功保存对方的IP地址信息的大小
返回值: 成功 新的同学对象 
		失败 -1
//假设没有用户链接过来的话我们accept 阻塞 (一直等待)
//client.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main()
{		
	//1.创建TCP通信对象
	int socketfd=socket(AF_INET,SOCK_STREAM,0);
	if(socketfd < 0)
	{
		perror("creat sock fail\n");
		return -1;
	}

	//初始化服务的地址信息 
	struct sockaddr_in  seraddr={0};	
	seraddr.sin_family  = AF_INET; //使用IPv4协议
	seraddr.sin_port	= htons(6666);   //网络通信都使用大端格式
	seraddr.sin_addr.s_addr =  inet_addr("10.8.6.108");  //32位的整形 
	
	//链接服务器 struct sockaddr *	
	int ret=connect(socketfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
	if(ret != 0)
	{
		perror("connect fail\n");
		return -1;
	}
	
	while(1)
	{
		char buf[1024]={0};
		scanf("%s",buf);
		write(socketfd,buf,strlen(buf)); 
		if(strcmp(buf,"exit") == 0)
		{
			break;
		}
	}
	
	//关闭网络通信
	close(socketfd);
}

//server.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 #include <unistd.h>
#include <string.h>
  #include <pthread.h>

int main()
{	
	//1.创建TCP通信对象
	int socketfd=socket(AF_INET,SOCK_STREAM,0);
	if(socketfd < 0)
	{
		perror("creat sock fail\n");
		return -1;
	}


	//2.进行IP地址的绑定   bind
	struct sockaddr_in  seraddr={0};
	seraddr.sin_family  = AF_INET; //指定网络协议为 IPV4
	seraddr.sin_port	= htons(6666); //取值范围 最大值65535 16位的整形   1024以后
	seraddr.sin_addr.s_addr = INADDR_ANY; //自动检测IP地址
	
	int ret=bind(socketfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
	if(ret != 0)
	{
		perror("bind fail\n");
		return -1;
	}

	//设置为监听模式
	ret=listen(socketfd,5);
	if(ret != 0)
	{
		perror("listen fail\n");
		return -1;
	}
		
	//接受对方的链接请求
	struct sockaddr_in clienaddr={0};
	int len=sizeof(clienaddr);
	int newsocket=0;
	 
	newsocket=accept(socketfd,(struct sockaddr *)&clienaddr,&len);
	if(newsocket < 0)
	{
		perror("accept fail\n");
		return -1;
	}
	
	//输出客户端ip和端口号
	struct sockaddr stAddr = {0};
	struct sockaddr_in stAddrIn = {0};
	long lNameLen = sizeof(struct sockaddr);
	if(0 == getsockname(newsocket, &stAddr, (socklen_t *)&lNameLen))
	{
		memcpy(&stAddrIn, &stAddr, lNameLen);
		printf("CurSocket[%d], ClientAddr[%s:%d].\n", newsocket, inet_ntoa(stAddrIn.sin_addr), ntohs(stAddrIn.sin_port));
	}
	
	//进行通信 
	while(1)
	{
		char buf[1024]={0};
		read(newsocket,buf,sizeof(buf)); 
		printf("buf=%s\n",buf);
	}
	 
	return -1; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值