您的位置:首页 > 理论基础 > 计算机网络

Network Programming for Microsoft Windows 2nd(Windows 网络编程第二版) 学习心得

2010-10-26 10:02 316 查看
Winsock 头文件和所要求链接的库

1.winsock2.h Ws2_32.lib (Winsock 2)
2.winsock.h wsock32.lib (Winsock 1, Windows CE 仅支持Winsock 1.)
3.MSWSOCK.H MSWSOCK.DLL (MSWSOCK.LIB, 我认为应该是这个).

高字节,低字节
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
wVersionRequested 的设置用 MAKEWORD (x, y) ; x 是高字节, y 是低节字.
高字节是次要版本, 低字节是主要版本.
一个数字,如16进制表示的 0xFEDC, 内存中高字节的FE在右边, 低字节的的DC 在左边. 刚好跟书写规则相反.

Winsock 的初始化以及退出
WSADATA wsaData;
if (WSAStartup (MAKEWORD (2, 2), &wsaData) != 0)
{
printf ("WSAStartup Error!/n");
return;
}

if (WSACleanup() == SOCKET_ERROR)
{
printf ("WSACleanup Error!/n");
}

错误
大多数函数返回的错误都是 SOCKET_ERROR, 实际的值是-1.
int WSAGetLastError (void); 用于获取确切的错误.
同时,void WSASetLastError(int);函数可以手动设定错误号.

IP和端口
指定IP地址和服务端口通过SOCKADDR_IN 构造函数
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family 设置为 AF_INET 表示用IP协议
sin_port 服务端口, 是网络字节序列的. 需要用下面某个函数进行一下转换. 主机序列到网络序列:
u_long htonl(u_long hostlong);
int WSAHtonl(SOCKET s, u_long hostlong, u_long FAR * lpnetlong);
u_short htons(u_short hostshort);
int WSAHtons(SOCKET s, u_short hostshort, u_short FAR * lpnetshort);
相反的函数,网络序列到主机序列:
u_long ntohl(u_long netlong);
int WSANtohl(SOCKET s, u_long netlong, u_long FAR * lphostlong);
u_short ntohs(u_short netshort);
int WSANtohs(SOCKET s, u_short netshort, u_short FAR * lphostshort);
sin_addr.s_addr = inet_addr ("192.168.100.236"); inet_addr 函数据字符串转换为网络序列的整型数.
本地地址:
sin_addr.s_addr = htonl(INADDR_ANY);

创建一个SOCKET的两个函数: socket and WSASocket
SOCKET socket (int af, int type, int protocol);
SOCKET WSASocket (int af, int type, int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo, GROUP g, DWORD dwFlags);
创建TCP: SOCKET tcpSocket = socket (AF_INET , SOCK_STREAM, IPPROTO_TCP);
创建UDP: SOCKET udpSocket = socket (AF_INET , SOCK_DGRAM, IPPROTO_UDP);

控制SOCKET选项和行为的的4个有用函数: setsockopt, getsockopt, ioctlsocket, and WSAIoctl.

绑定一个SOCKET
int bind(SOCKET s, const struct sockaddr FAR* name, int namelen);
出错返回:SOCKET_ERROR
在TCP/IP, 用WSAGetLastError()检索错误有可以得到 WSAEADDRINUSE 或者 WSAEFAULT 两个宏定义的错误.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: