网络IP地址类型:IPV4,IPV6
在Linux中使用ifconfig查看自己的IP地址
mac地址和IP地址都能分别表示特定的一台主机,mac是设备的固定地址,IP地址是可变的。
管理IP地址和mac 地址的是协议,有arp、rarp协议等
Linux中使用ifconfing查看本机IP地址
端口:进程的编号,用来区分同一台主机运行的不同进程
网络分层模型:
osi模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP模型:应用层、传输层、网络层、数据链路层
套接字(socket):可以实现不同主机之间的进程通信
通用socket地址类型:
struct sockaddr
{
sa_family_t sa_family;//地址族
char sa_data[14];
};
TCP编程流程:
简单的服务端和客户端收发数据代码
//TCP服务端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接字
assert(socket != -1);
struct sockaddr_in saddr,caddr;//创建结构体,IPV4地址存放类型
memset(&saddr,0,sizeof(saddr));//清空结构体
saddr.sin_family = AF_INET;//地址族
saddr.sin_port = htons(6000);//端口号
saddr.sin_addr.s_addr = inet_addr("127,0,0,1");//IP地址
int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//绑定套接字使用的端口
assert(res != -1);
res = listen(sockfd,5);//接受客户端的连接请求
while(1)
{
int len = sizeof(caddr);
int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//接收客户端连接,产生连接套接字
if(c<0)
{
continue;//没有接收到则继续等待接收
}
char buff[128] = {0};
int n = recv(c,buff,127,0);//接收信息并存放在buff中
printf("buff-%s\n",buff);//打印接收的信息
send(c,"ok",2,0);//向客户端发送成功信息
close(c);//关闭套接字
}
}
//TCP客户端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
assert(socket != -1);
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127,0,0,1");
int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
assert(res != -1);
printf("input:\n");
char buff[128] = {0};
fgets(buff,127,stdin);
send(sockfd,buff,strlen(buff),0);
memset(buff,0,128);
recv(sockfd,buff,127,0);
printf("buff=*s\n",buff);
close(sockfd);
}