本文主要是介绍(important)关于socket的一些理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于socket的一些理解
- important
important
- 服务端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端口。
- 客户端在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(1234); // 端口
connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
上面具体的ip,必须跟服务端的ip一样。
- 如果是同一个主机之间通信,那么客户端直接127.0.0.1就行,服务端可以INADDR_ANY,也可以127.0.0.1,也可以使用那个能够ping通的ip。
- 如果是两个主机之间通信,那么客户端必须写出服务端具体的ip!!!
- 因为accept函数需要传入一个传出参数,其中存储着客户端的信息,一旦建立连接以后,我们就可以打印出来。客户端的端口号应该是操作系统自动分配的。
// 接收客户端请求
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函数,可以看之前写的文章。
这篇关于(important)关于socket的一些理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!