网络编程:
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;
}