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 两个宏定义的错误.
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 两个宏定义的错误.
相关文章推荐
- Network Programming for Microsoft Windows 2nd Edition
- Network Programming For Microsoft Windows Notes:Introduction to Winsock
- multicast(一) (转自network programming for microsoft windows, second edition.)
- Programming Applications for Microsoft Windows核心编程(-)
- Network Programming for Microsoft Windows
- Network Programming For Microsoft Windows Notes:Winsock I/O
- Using epoll() For Asynchronous Network Programming (使用epoll()进行异步网络编程)
- windows编程学习--网络编程学习--winsock编程(1)
- windows编程--网络编程学习--winsock编程(2)
- android 学习心得1---网络编程
- 读programming application for microsoft windows时产生的一个疑问
- Windows网络编程之Select模型学习笔记
- Lua for Windows 开始学习Lua编程
- Network Emulator for Windows Toolkit一个模拟弱网络环境的软件
- 提高IOCP 效率的一些方法,技巧 (来自WINDOWS 网络编程第二版)
- Configuring Linux Workstations for a Microsoft Windows Environment and Network
- 潜心开始学习网络编程的第一步 ,UNP(Unix Network Programming)第一章,时间服务器到windows的移植
- 网络编程学习心得
- Network Emulator for Windows Toolkit 使用心得(一)
- network emulator for windows toolkit 网络模拟器