TCP實現細節
阿新 • • 發佈:2022-04-05
轉換地址格式
inet_ntop()
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len) { const u_char *p = (const u_char*)addrptr; if (family == AF_INET) { char temp[INET_ADDRSTRLEN]; snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); if (strlen(temp) >= len) { errno = ENOSPC; rturn (NULL); } strcpy(strptr, temp); return (strptr); } errno = EAFNOSUPPOPT; return (NULL); } // 用inet_pton(AF_INET, cp, &src.sin_addr); // 代替src.sin_addr.s_addr = inet_addr(cp);
inet_pton()
int inet_pton(int family, const char *strptr, void *addrptr) { if (family == AF_INET) { struct in_addr in_val; if (inet_aton(strptr, &in_val)) { memcpy(addrptr, &in_val, sizeof(in_val)); return (1); } } errno = EAFNOSUPPOPT; return (-1); } // 用char str[INET_ADDRATRLEN]; // ptr = inet_ntop(AF_INET, &src.sin_addr, str, sizeof(str)); // 代替ptr = inet_ntoa(src.sin_addr);
inet_addr()
轉換網路主機地址(點分十進位制)為網路位元組序二進位制值,如果引數 char *cp 無效則返回-1(INADDR_NONE),但這個函式有個缺點:在處理地址為255.255.255.255時也返回-1,雖然它是一個有效地址,但inet_addr()無法處理這個地址。in_addr_t inet_addr(const char *cp);
inet_ntoa()
net_ntoa()函式轉換網路位元組序地址->標準的點分十進位制地址。該函式返回值指向儲存點分十進位制的字串地址的指標,該字串的空間為靜態分配 的,所以在第二次呼叫這個函式時,意味著上一次呼叫並儲存的結果將會被覆蓋(重寫)。char *inet_ntoa(struct in_addr in);