2018.08.22

网络编程:

       linux下的四层网络模型

应用层,传输层,网际层,网络接口层。

各自的作用:

网络接口层实现了网卡接口的网络驱动程序,以处理数据在网络媒介上(比如以太网)上的传输。不同的物理网络层具有不同的电器特性,网络驱动驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。

网际层实现数据包的选路和转发。WAN通常使用众多分级的路由器来连接分散的主机或LAN,因此,通信的两台主机一般不是直接连接的,而是通过多个中间节点连接的。网络层的任务就是选择这些节点,以确定两台主机间的通信路径。同时,网络层对上层协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双发是直接相连的。

传输层为两台主机上的应用程序提供端到端(end to end)的通信。与网络层使用的逐跳的通信方式不同,传输层只关心通信的起始端和目的端,而不在话数据包的中转过程。

应用层负责处理应用程序的逻辑。应用层协议很多:ping:应用程序,不是协议,调试网络环境;telnet:远程登录协议;DNS:机器域名到ip的转换;

       TCP/IP 实际上一个协同工作的通信家族,为网络数据通信提供通路。为讨论方便可TCP/IP 协议组大体上分为三部分:

    1、Internet 协议(IP)

    2、传输控制协议(TCP)和用户数据报协议(UDP)

    3、处于 TCP 和 UDP 之上的一组应用协议。它们包括:TELNET,文件传送协议(FTP),域名服务(DNS)和简单

邮件传送程序(SMTP)等

利用tcp实现消息互发

服务器:
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 8888
#define SIZE 1000

void *handle(void *arg)
{
	char buf[32] = {0};
	int ret;
	int fd = *(int *)arg;
	pthread_detach(pthread_self());
	while(1)
		{
			ret = recv(fd, buf, sizeof(buf), 0);
			if(-1 == ret)
			{
				perror("recv");
				exit(1);
			}
			if(!strcmp(buf, "bye"))
			{
				close(fd);
				break;
			}
			printf("recv %d from client %s\n",fd,buf);
			memset(buf, 0, sizeof(buf));

		}
	


}



int main()
{
	int ret, fd[SIZE], i = 0, ret1;
	int sockfd;
	pthread_t tid;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;

	sockfd = socket(PF_INET, SOCK_STREAM, 0);
	if(sockfd == -1)
	{
		perror("socked");
		exit(1);
	}
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = PF_INET;
	server_addr.sin_port = PORT;
	server_addr.sin_addr.s_addr = inet_addr("192.168.1.128");
	ret = bind(sockfd, (struct  sockaddr *)&server_addr, sizeof(server_addr));
	if(-1 == ret)
	{
		perror("bind");
		exit(1);
	}
	ret = listen(sockfd, 5);
	if(ret == -1)
	{
		perror("listen");
		exit(1);
	}
	int length = sizeof(client_addr);
	
	while(1)
	{
		printf("waiting for recept...\n");
		fd[i] = accept(sockfd,(struct sockaddr *)&client_addr, &length);
		if(fd[i] == -1)
		{
			perror("accept");
			exit(1);
		}
		ret1 = pthread_create(&tid, NULL, handle, &fd[i]);
		if(ret1 != 0)
		{
			perror("pthread");
			exit(1);
		}
		printf("%d port is %d",fd[i], client_addr.sin_port);
		i++;
	}
	return 0;
}

 

 

客户端:
 

#include <stdio.h>
#include <string.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <signal.h>
#define PORT 8888
int sockfd;
void stop()
{
	send(sockfd, "bye", strlen("bye"), 0);
	printf("BYE\n");
	close(sockfd);
	exit(1);
}
int main()
{
	int ret, fd;
	struct  sockaddr_in server_addr;
	signal(SIGINT,stop);
	sockfd = socket( PF_INET,SOCK_STREAM, 0);
	if(sockfd == -1)
	{
		perror("socket");
		exit(1);
	}
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = PF_INET;
	server_addr.sin_port = PORT;
	server_addr.sin_addr.s_addr = inet_addr("192.168.1.128");
	ret = connect(sockfd,(struct  sockaddr *)&server_addr,sizeof(server_addr));
	if(-1 == ret)
	{
		perror("connect");
		exit(1);
	}
	char buf[32] = "helloworld!";
	while(1)
	{
		ret = send(sockfd, buf, strlen(buf), 0);
		if(-1 == ret)
		{
			perror("send");
			exit(1);
		}
		sleep(1);
	}
	return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值