目录
1、主机字节序列和网络字节序列
2、套接字地址结构
3、IP地址转换函数
4、TCP协议编程:
(1)服务器端:
(2)客户端:
主机字节序列分为大端字节序和小端字节序
大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节序列存储在内存的高地址处。
小端字节序是指整数的高位字节存储在高地址处,低位字节序列存储在内存的低地址处。
网路字节序列:大端字节序列,转换为大端:htons()
通用套接字地址结构:
struct sockaddr
{
sa_family_t sa_family;
char sa_date[14];
}
传的时候会根据需要的类型,传递参数。
ipv4地址直接按的转换:
int_addr_t inet_addr(const char *cp);//把字符串表示的IPV4地址转换为网络字节序
char*inet_ntoa(stuct in_addr in)//把网络字节序转换为字符串表示的
创建套接字:socket()
给套接字指定地址(绑定)IP+端口:bind()
开机 、监听队列(不阻塞):listen()
接受链接:accept()
接收数据:recv()
发送数据:send()
关闭链接:close()
服务器端:
int main()
{
//创建套接字
int sockfd=socket(AF_INET,SOCK_STREAM,0)
// 协议版本
//创建失败就返回
if(sockfd==-1)
{
exit(1);;
}
//指定服务器的ip和端口
struct sockaddr_in saddr,caddr;//套接字的地址,监听套接字
//清空服务器端
memset(&saddr,0,sizeof(saddr));//制空
//填充ip和端口
saddr.sin_family=AF_INET;
saddr.sin_port=htons(6000);//1024以内知名端口,4096以内保留端口,临时端口(5000+)
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//ip地址
int res=bind(sockfd,(sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
printf("bind err\n");
exit(1);
}
//设置监听队列
res=listen(scokfd,5);
// 套接字 监听队列长度
if(res==-1)
{
exit(1);
}
//接受链接
while(1)
{
//获取客户端的套接字地址的长度
socklen_t len=sizeof(caddr);
//连接套接字
int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
if(c<0)
{
continue;
}
printf("acceptc=%d,ip=%s,port=%d",c,inei_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
//定义接收数据的数组
char buff[128]={0};
// 连接套接字 接收数组,接收的长度
recv(c,buff,127,0);
printf("buff=%s",buff);
//返回数据, 连接套接字 返回的数据 返回数据的长度
send(c,"ok",2,0);
//关闭连接套接字
close(c);
}
创建套接字:socket()
向服务器发起链接:connect()
给服务端发送数据:send()
接收服务端发送的数据:recv()
关闭链接:close()
#include
#include
#include
#include
#include
#include
#include
//客户端
int main()
{
//创建套接字
int sockfd=socket(AF_INET,SOCK_STREAM,0);
//判断是否创建成功
if(sockfd==-1)
{
exit(1);
}
//绑定套接字地址
struct sockaddr_in saddr;
//套接字清空
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
//绑定端口
saddr.sin_port=htons(6000);
//绑定IP地址
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
//向服务器发起连接
int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
printf("connect err\n");
exit(1);
}
printf("input\n");
char buff[128];
fgets(buff,128,stdin);
//向服务器发送数据
send(sockfd,buff,strlen(buff),0);
//将buff制空
memset(buff,0,sizeof(buff));
//接收服务端返回的数据
recv(sockfd,buff,127,0);
//输出服务端返回的数据
printf("buff=%s",buff);
//关闭套接字
close(sockfd);
exit(0);
}