一、 如何实现跨主机?
套接字socket()编程
二. 网络编程
1、 网络体系结构模型
OSI模型: 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 -> 7
TCP/IP协议模型: 应用层 传输层、网络层、 网络接口与物理层 -> 4
2、 数据是如何发送?
数据经过每一个处理层,都会添加对应的头数据。数据到达目标主机后,会不断解析每一层头数据。
三、传输层协议
TCP协议、UDP协议
1、 TCP协议?
面向于有连接的传输方式,是一种可靠的方式。 -> (打电话)
听电话人 -> 服务器端
打电话人 -> 客户端
2、 TCP协议工作流程
套接字其实是一个特殊文件描述符,所以占用系统资源。
端口号 -> 16位 0~65535 0~1023已经被系统占用,用户有效: 1024~65536
IP地址 -> 32位
/* Address to accept any incoming messages. */
#define INADDR_ANY ((unsigned long int) 0x00000000) -> /usr/include/linux/in.h
服务器:
在ubuntu上运行,
void *routine(void *arg)
{
int connfd = *(int *)arg;
char buf[50];
while(1)
{
bzero(buf,sizeof(buf));
fgets(buf,50,stdin);
send(connfd,buf,strlen(buf),0);
if(strncmp(buf,"quit",4) == 0)
{
exit(0);
}
}
}
int main(int argc,char *argv[])
{
/*1.创建一个TCP协议的未连接套接字*/
int sockfd = socket(AF_INET,SOCK_STREAM,0);
/*2.绑定号码到未连接套接字上*/
struct sockaddr_in srvaddr,cliaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);
bzero(&cliaddr,len);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)&srvaddr,len);
/*3.设置监听套接字*/
listen(sockfd,5);
/*4.阻塞接受对方连接*/
int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
if(connfd > 0)
{
perror("connection fail:\n");
}
/*5.创建一个子线程,用于发送数据*/
pthread_t tid;
pthread_create(&tid,NULL,routine,(void*)&connfd);
/*6.主线程负责接受对方发送来的信息*/
char buf[50];
while(1)
{
bzero(buf,50);
recv(connfd,buf,sizeof(buf),0);
printf("from client:%s",buf);
if(strncmp(buf,"quit",4) == 0)
{
exit(0);
}
}
/*7.挂断*/
close(connfd);
close(sockfd);
return 0;
}
客户端:
移植到开发板上运行
void *routine(void *arg)
{
int sockfd = *(int *)arg;
char buf[50];
while(1)
{
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("from server:%s",buf);
if(strncmp(buf,"quit",4) == 0)
exit(0);
}
}
int main(int argc,char *argv[])
{
//1. 创建一个TCP协议的未连接套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0); //sockfd是未连接套接字
//2. 准备对方的IP地址,端口号
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
//3. 发起连接
int ret;
ret = connect(sockfd,(struct sockaddr *)&srvaddr,len);
if(ret < 0)
{
printf("connect error!\n");
}
//5. 创建一个子线程,用于发送数据
pthread_t tid;
pthread_create(&tid,NULL,routine,(void *)&sockfd);
//4. 畅聊
char buf[50];
while(1)
{
bzero(buf,50);
fgets(buf,50,stdin);
send(sockfd,buf,strlen(buf),0);
if(strncmp(buf,"quit",4) == 0)
break;
}
//5. 挂断电话
close(sockfd);
return 0;
}
将ubuntu和开发板的IP设置为同一个网关下,然后打开服务器,让客户端连接通信。