(important)关于socket的一些理解

关于socket的一些理解

important

  1. 服务端bind表示之前,要初始化一个结构体
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);       // 大端
addr.sin_addr.s_addr = INADDR_ANY; // 0.0.0.0

然后再调用bind函数,表示服务端程序,允许任何本地IP地址接受连接,(因为可能有多个网卡,多个ip地址,虚拟机的话,一般好像只有一个ip可以用,得用ping的通的那个),同时绑定本地的9999端口。

  1. 客户端在connect之前,同样要写清楚,向哪个服务器申请连接,也就是说必须要指名服务器的端口和ip地址
// 向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));           // 每个字节都用0填充
serv_addr.sin_family = AF_INET;                     // 使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 具体的IP地址
serv_addr.sin_port = htons(9999);                   // 端口
connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

上面具体的ip,必须跟服务端自己的ip一样。端口也必须一样。

  • 如果是同一个主机之间通信,那么客户端直接127.0.0.1就行,服务端可以INADDR_ANY,也可以127.0.0.1,也可以使用那个能够ping通的ip。
  • 如果是两个主机之间通信,那么客户端必须写出服务端具体的ip!!!
  1. 因为accept函数需要传入一个传出参数,其中存储着客户端的信息,一旦建立连接以后,我们就可以打印出来。客户端的端口号应该是操作系统自动分配的,可以在服务端打印客户端的ip和端口。
// 接收客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
int clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
// 打印收到的客户端地址端口信息
std::cout << "Client address: " << inet_ntoa(clnt_addr.sin_addr) << ", port: " << ntohs(clnt_addr.sin_port) << std::endl;

因为之前都是统一指定的ip为127.0.0.1 一直只是尝试本机通信,明白上述三点以后,seraddr.sin_addr.s_addr到底应该填多少,相信大家心里都会清楚。

至于其他的socket函数,可以看之前写的文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值