make_internet_address(hostname, portnum, &m_saddr); if((bind(sock_id, (struct sockaddr *)&m_saddr, sizeof(m_saddr))) != 0) return -1; return sock_id; }
时间: 2024-04-03 21:37:12 浏览: 91
这是一个创建套接字并绑定地址的函数。函数名为 `make_server_socket`,接收主机名 `hostname` 和端口号 `portnum` 作为参数,返回一个套接字文件描述符。
1. `make_internet_address(hostname, portnum, &m_saddr)`:该函数用于创建一个 `sockaddr_in` 类型的地址,其中 `hostname` 是主机名,`portnum` 是端口号,`&m_saddr` 是指向该地址结构体的指针。该函数会将 `m_saddr` 的成员 `sin_family` 设置为 `AF_INET`(表示 IPv4 地址族),成员 `sin_port` 设置为网络字节序的端口号,成员 `sin_addr.s_addr` 设置为网络字节序的 IPv4 地址。
2. `bind(sock_id, (struct sockaddr *)&m_saddr, sizeof(m_saddr))`:该函数用于将套接字 `sock_id` 绑定到指定的地址 `m_saddr` 上。第二个参数是一个指向 `sockaddr` 结构体的指针,因此需要将 `m_saddr` 转换为 `sockaddr` 类型的指针,使用强制类型转换即可。第三个参数表示地址结构体的大小。
3. 如果 `bind` 函数执行成功,返回套接字文件描述符 `sock_id`,否则返回 -1 表示绑定失败。
相关问题
struct hostent * hp; bzero((void*)addrp, sizeof(struct sockaddr_in)); hp = gethostbyname(hostname); //这个方法好像对于WSL是不行的 if(hp == NULL) return -1; bcopy((void *)hp->h_addr, (void *)&addrp->sin_addr, hp->h_length); //->的优先级高于&,学到了
这段代码的作用是将主机名(hostname)转换为IP地址,并将IP地址填充到sockaddr_in结构体(addrp)中。具体实现如下:
1. 首先清空sockaddr_in结构体的内容,以便将新的地址信息填充进去。
2. 调用gethostbyname函数获取主机名对应的IP地址信息。该函数返回一个指向hostent结构体的指针,该结构体中包含了主机名、别名、地址类型以及地址信息等相关数据。
3. 如果gethostbyname函数返回了NULL,表示主机名无法解析,函数会返回-1。
4. 否则,使用bcopy函数将主机名对应的IP地址信息拷贝到sockaddr_in结构体中的sin_addr字段中。h_addr字段是hostent结构体中的一个地址指针,指向一个IP地址的字节序列,其长度由h_length字段指定。
5. 注意到代码中使用了bzero和bcopy函数,这两个函数是字符串处理函数,用于清空内存和拷贝内存。这里将它们用于清空和拷贝网络地址信息。在新版本的C语言标准中,建议使用memset和memcpy函数来替代它们。
char* getIP() { char* hostIP; char hostName[256]; struct hostent* hostEntry; hostEntry = gethostbyname(hostName); if (hostEntry != NULL && hostEntry->h_addr_list[2] != NULL) { hostIP = inet_ntoa(*(struct in_addr*)hostEntry->h_addr_list[2]); } return hostIP; }
这段代码的作用是获取当前主机的IP地址。但是在这段代码中,变量hostName并没有被初始化,所以该函数可能会返回错误的IP地址。应该先通过gethostname函数获取主机名,再将其作为参数传入gethostbyname函数中进行获取IP地址。另外,h_addr_list[2]获取的是第3个IP地址,而不是第1个。正确的代码应该类似于这样:
```
char* getIP() {
char* hostIP;
char hostName[256];
struct hostent* hostEntry;
gethostname(hostName, sizeof(hostName));
hostEntry = gethostbyname(hostName);
if (hostEntry != NULL && hostEntry->h_addr_list[0] != NULL) {
hostIP = inet_ntoa(*(struct in_addr*)hostEntry->h_addr_list[0]);
}
return hostIP;
}
```
阅读全文