VC++网络socket编程基础

通常套接字有两种类型,一种是流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM),分别对应TCP和UDP


网络字节序是指TCP/IP协议中规定的数据传输使用格式,与之相对的字节顺序是主机字节顺序。网路字节序=大端


在TCP/IP协议通信中,用户使用IP地址和端口号进行确定通信双方。


套接字地址结构
struct sockaddr_in 
{
short sin_family; //指定地址家族即地址格式    AF_INET(TCP/IP)
unsigned short sin_port;   //端口号码
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //指定为0
};
其中结构成员sin_addr表示32位的IP地址结构
struct in_addr
{
union
{
struct
{
unsigned char s_b1, s_b2, s_b3, s_b4;
} S_un_b; //用四个u_char字符描述IP地址
struct
{
unsigned short s_w1, s_w2;
} S_un_w; //用2个u_short类型描述IP地址
unsigned long S_addr; //用1个u_long类型描述IP地址(网络字节序排列)    (通常用这个)
} S_un;
};


数据进行网络发送时应转为网络字节序,从网络中接收数据时应转为主机字节序


字节顺序转换函数:(一下API与OS无关)
u_short htons(u_short hostshort) 主机字节序->网络字节序
u_long htonl(u_long hostlong) 主机字节序->网络字节序
u_short ntohs(u_short netshort) 网络字节序->主机字节序
u_long ntohl(u_long netlong) 网络字节序->主机字节序
unsigned long inet_addr(const char FAR * cp) 字符串IP->网络字节序的IP
char FAR * inet_ntoa(struct in_addr in) 网络字节序的IP->字符串IP


所有的windows socket函数都是从动态链接库WS2_32.DLL中导出的,编程前应先加载。加载后必须调用函数WSAStartup()对该库进行初始化,之后才能正确调用其他API
WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested为当前套接字版本号
typedef struct WSAData
{
    WORD           wVersion;//库文件建议APP使用的版本号
    WORD           wHighVersion;//库文件支持的最高版本
    char           szDescription[WSADESCRIPTION_LEN + 1];//描述库文件的字符串
    char           szSystemStatus[WSASYS_STATUS_LEN + 1];//系统状态字符串
    unsigned short iMaxSockets;//同时支持的最大套接字数
    unsigned short iMaxUdpDg;//废弃
    char FAR *     lpVendorInfo;//废弃
} WSADATA, * LPWSADATA; 


例:
WSAData data;
WORD wVersionRequested = MAKEWORD(2, 0);
::WSAStartup(wVersionRequested , &data);


当程序退出时,应调用WSACleanup()函数释放该套接字库。

猜你喜欢

转载自blog.csdn.net/job_baiqiang/article/details/81035224