socket <套接字>:简单的说就是一个文件描述符,常用的有 tcp流式套接字(SOCK_STREAM)、udp数据报套接字(SOCK_DGRAM)。
tcp:类似于管道,先建立连接再通信,安全(传输信息不丢失)但是会产生粘包。
udp:不需要建立连接,不会产生粘包,但是不安全会产生数据丢失。
linux虚拟机上有三个ip地址:
1、.物理网卡:传输数据时数据会被送出网卡,到交换机,交换机判断 i p 再送出去。
2、环形ip:不会送出网卡,直接把数据写到缓冲区。
3、0.0.0.0:系统自动选择一种最快的传送方式。
参考代码:
服务器端:
int sockfd = socket(AF_INEF,SOCK_STREAM,0);//返回值如果小于0,创建失败
//第一个参数:tcp/ip协议组一般为AF_INET或NF_INET
//套接字类型
//通信协议,一般设置为0,根据套接字类型系统会自己选择
struct sockaddr_in svraddr//绑定bind
memset(&svraddr,0,sizeof(svraddr))
svraddr.sin_family = AF_INET
svraddr.sin_addr.s_addr = INADDR_ANY//绑定本机的所有ip类似于inet_addr("0.0.0.0")
//svraddr.sin_addr.s_addr = inet_addr("127.0.0.1")//绑定一个ip
svraddr.sin_port = htons(5555)//绑定端口号最好大于1024,因为前1024可能系统在使用
int ret = bind(sockfd,(struct sockaddr *)&svraddr,sizeof(svraddr));//如果返回值小于0绑定失败
ret = listen(sockfd,1024);//监听,错误返回 -1
//第一个参数:文件描述符
//第二个参数:半连接数最大
struct sockaddr_in removeaddr;
int addr_len = sizeof(removeaddr);
int fd = accept(sockfd,(struct sockaddr *)&removeaddr,addr_len)//返回一个与客户端通讯的文件描述符
//第一个参数:服务端套接字
//第二个参数:保存客户端套接字的“地方”(包括客户端ip,端口号等)
//第三个参数:“地方”的大小
// tcp的读写规则和管道一样
客户端:
int main(int argc,char *argv[])
{
if(argc < 3)
{
printf("run program + ip + port\n");
return -1;
}
char acbuf[1024]="";
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
error_exit("creat socket error");
}
struct sockaddr_in svraddr;
memset(&svraddr,0,sizeof(svraddr));
svraddr.sin_family = AF_INET;
svraddr.sin_addr.s_addr = inet_addr(argv[1]);
svraddr.sin_port = htons(atoi(argv[2]));
int ret =connect(sockfd,(struct sockaddr *)&svraddr,sizeof(svraddr));
if (ret <0)
{
error_exit("connet error");
}
// char buf[1024] = "";
// int rdsize =read(sockfd,buf,1024);
// printf("read size %d : %s\n",rdsize,buf);
while(1)
{
memset(acbuf,0,1024);
scanf("%s",acbuf);
if(strcmp(acbuf,"exit") == 0)
{
break;
}
write(sockfd,acbuf,strlen(acbuf));
memset(acbuf,0,1024);
read(sockfd,acbuf,1024);
printf("service:%s\n",acbuf);
// close(sockfd);
}
return 0;
}
三次握手:
第一次握手:建立连接时客户端发送syn包,并进入SYN_SEND模式,等待服务器确认(连接请求)
第二次握手:服务器收到syn包,同时自己也发送一个syn包,此时服务器进入SYN_RECV状态(授予连接)
第三次握手:客户端收到服务器回应的确认包,完成三次握手(确认连接)