socket基础

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状态(授予连接)

第三次握手:客户端收到服务器回应的确认包,完成三次握手(确认连接)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值