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

本文分享了阅读《Network Programming for Microsoft Windows 2nd》的心得体会,深入探讨了Windows环境下网络编程的原理与实践,包括Socket接口的使用和网络通信的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 两个宏定义的错误.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值