socket网络编程(1):格式转换函数
来源:互联网 发布:21天学通c语言 编辑:程序博客网 时间:2024/06/03 21:31
1、
不同类型CPU的计算机存储多字节值的顺序不同,故主机字节序分为大端序和小端序:
大端序:高位字节存储在起始(低)地址。
小端序:低位字节存储在起始(低)地址。例如Inter和AMD的主机。
网络中不同主机通信时,要统一采用网络字节序,网络字节序采用大端序。
2、
inet_addr()将一个IPV4类型的点分十进制格式IP地址转换为一个32位网络字节序IP地址。函数原型:
unsigned long inet_addr(const char *cp);
htons()将一个unsigned short(端口号)从主机字节序转换为网络字节序。函数原型:
u_short htons(u_short hostshort);
htonl()将一个unsigned long从主机字节序转换为网络字节序。
eg:
SOCKADDR_IN addr; addr.sin_family = AF_INET;addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addr.sin_port = htons(6000);connect(sockClient, (SOCKADDR*)&addr, sizeof(SOCKADDR));
inet_ntoa()函数将一个in_addr结构体类型转换为点分十进制格式IP地址。函数原型:
char* inet_ntoa(struct in_addr in);
ntohs()函数将一个unsigned short(端口号)从网络字节序转换为主机字节序。函数原型:
u_short ntohs(u_short netshort);
ntohl()函数将一个unsigned long从网络字节序转换为主机字节序。
eg:
SOCKET sockConnect = accept(sockSrv, (sockaddr*)&addrRemote, &len);char sendBuf[100];sprintf(sendBuf, "Welcome %s:%d!", inet_ntoa(addrRemote.sin_addr), ntohs(addrRemote.sin_port));
InetPton()、InetNtop()函数与inet_addr()、inet_ntoa()功能一样,不过增加了对IPV6地址类型的支持。
3、
gethostname():获得主机名。
gethostbyname()函数可以通过主机名获得主机信息,如主机别名、主机地址等。函数原型:
struct hostent* gethostbyname(const char *name);hostent结构体:
struct hostent {char *h_name; /* official name of host */ 主机正式名char **h_aliases; /* alias list */ 主机别名int h_addrtype; /* host address type */ 主机地址类型int h_length; /* length of address */ 主机地址长度char **h_addr_list; /* list of addresses */ 主机地址 }eg:
#include "winsock2.h"#pragma comment(lib, "ws2_32.lib")int GetHostInfor(){WORD wVersionRequested = MAKEWORD(1, 1);WSADATA wsaData;int err;err = WSAStartup(wVersionRequested, &wsaData);//加载套接字库if(err != 0)return 1;if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){WSACleanup();return 1;} struct hostent *host; if((host = gethostbyname("www.google.com")) == NULL) {int n = WSAGetLastError();fprintf(stderr,"获得地址信息失败:%d,%s\n", n,strerror(h_errno));return 1; } fprintf(stdout,"官方主机名:%s\n", host->h_name); fprintf(stdout,"主机别名:\n"); char **p; for(p=host->h_aliases; *p!=NULL; p++) {fprintf(stdout,"\t\t%s\n", *p); } if(host->h_addrtype == AF_INET) {fprintf(stdout,"主机地址类型: IPV4\n"); } else {fprintf(stdout,"主机地址类型: IPV6\n"); } fprintf(stdout,"主机地址长度:%d\n", (host->h_length)*8); fprintf(stdout,"主机地址:\n"); struct in_addr addr; for(p=host->h_addr_list; *p!=NULL; p++) {addr.s_addr = *(u_long *) *p;fprintf(stdout,"\t%s\n", inet_ntoa(addr)); }return 0;}
输出为:
官方主机名:www.google.com
主机别名:
主机地址类型: IPV4
主机地址长度:32
主机地址:
74.125.128.99
74.125.128.105
74.125.128.147
74.125.128.106
74.125.128.103
74.125.128.104
gethostbyaddr()函数通过主机地址(网络字节序)获得主机信息。Windows Sockets 2则使用getnameinfo()。函数原型:
struct hostent* gethostbyaddr(const char *addr, int len, int type);
4、
getservbyname()函数获得给定服务名和协议名的相关服务信息。函数原型:
struct servent* getservbyname(const char *name, const char *proto);
servent结构体:
struct servent {char *s_name; /* official service name */ 官方服务名char **s_aliases; /* alias list */ 别名列表int s_port; /* port number */ 端口号char *s_proto; /* protocol to use */ 使用协议 }eg:
#include "winsock2.h"#pragma comment(lib, "ws2_32.lib")int GetServInfor(){WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err; err = WSAStartup(wVersionRequested, &wsaData);//加载套接字库 if(err != 0) return 1; if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return 1; } struct servent *ser; if((ser = getservbyname("http", NULL)) != NULL) {fprintf(stdout,"官方服务名:%s\n", ser->s_name); fprintf(stdout,"别名:\n");char **p;for(p = ser->s_aliases; *p!=NULL; p++){fprintf(stdout,"\t%s\n", *p); }fprintf(stdout,"端口号:%d\n", ntohs(ser->s_port)); fprintf(stdout,"使用协议:%s\n", ser->s_proto); }return 0;}输出为:
官方服务名:http
别名:
www
www-http
端口号:80
使用协议:tcp
getservbyport()函数获得给定端口号和协议名的相关服务信息。函数原型:
struct servent* getservbyport(int port, const char *proto);
- socket网络编程(1):格式转换函数
- socket网络编程函数
- 深入理解计算机系统--网络编程(2)格式转换函数
- 网络编程1 - socket基本函数
- 网络编程之格式转换
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- Linux网络编程之socket:socket与字节序以及地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- Socket网络编程常用函数
- 网络socket编程相关函数
- c++中对单链表操作---合并两个链表&&单链表逆序&&删除链表中的中间结点
- Linux的经典shell命令整理
- [AWK]使用AWK进行分割字符串以及截取字符串
- IBM-Aix 查看pv/vg/lv
- #ifdef 和 #if defined 的区别
- socket网络编程(1):格式转换函数
- XML 三种解析方式简介
- 使用dd来备份还原mbr,分区表
- vlc-android 中调用用libvlcjni.so实现流媒体播放,自己使用libvlcjni.so
- UVa:140 Bandwidth
- C#操作excel
- [Leetcode] Minimum Window Substring (Java)
- 推荐一款专为MySQL设计的ER/数据库建模工具MySQL Workbench
- 网站回到顶部js特效