Windows网络编程

Winsock编程基础
本文介绍了Windows环境下使用Winsock进行网络编程的基本步骤和技术要点,包括Winsock的初始化与清理、IPv4地址结构体的使用以及创建套接字的方法。

 

一、Winsock初始化

      每个Winsock程序都必须加载合适的Winsock DLL版本,现有winsock1,winsock2。在调用Winsock之前首先的工作就是加载winsock相应的库。
      加载所用的API是WSAStartup 
      当应用程序结束之后,关闭的API是WSACleanup

     WSAStartup需要一个版本号信息及一个WSADATA的结构体作为函数的返回值。它的原型是这样的:

None.gifint WSAStartup(WORD wVersionRequested,
None.gif         LPWSADATA lpWSAData);

    下面, 看一下WSAData结构体究竟描述了些什么信息:

None.giftypedef struct WSAData
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    WORD wVersion; 
//版本号
InBlock.gif
     WORD wHighVersion; //现有Winsock的最高版本
InBlock.gif
     char szDescription[..]; //没有实际作用
InBlock.gif
     char szSystemStatus[..]; //没有实际作用
InBlock.gif
     unsigned short iMaxSocket; //可同时打开的最大套接字数量
InBlock.gif
     unsigned short iMaxUdpDg; //数据报最大长度
InBlock.gif
     char FAR* lpVendorInfo; //保留字段 
ExpandedBlockEnd.gif
}
WSADATA* LPWSADATA

    具体的代码:
   

None.gif#include "winsock2.h"
None.gif
int main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    WSADATA wsaData;
InBlock.gif    
int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
InBlock.gif    
if(Ret != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      cout
<<"无法初始化winsock."<<endl;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
InBlock.gif      cout
<<"初始化winsock成功"<<endl;
InBlock.gif
InBlock.gif     
//dot.gif..
InBlock.gif
 
InBlock.gif     
if(WSACleanup()==SOCKET_ERROR)
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif       cout
<<"WSAData无法cleanup.";
ExpandedSubBlockEnd.gif     }

InBlock.gif     
return 0;
ExpandedBlockEnd.gif}

 

二、IPv4结构体

       当计算机通过TCP、UDP进行通迅时,用得最多的可能就是其主机的IP地址,应用程序的端口号。如何来表示这些信息呢?在Winsock中,可以通过一个结构体来指定其IP和服务端口的信息。结构体如下:
   

None.gifstruct sockaddr_in
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
short sin_family; //必须指定AF_INET
InBlock.gif
     u_short sin_port; //端口号
InBlock.gif
      struct in_addr sin_addr; //IP的地址表示
InBlock.gif
     char sin_zero[8]; //填充字段,用来兼容SOCKADDR结构体
ExpandedBlockEnd.gif
}
;
None.gif

还有一些其它的函数,可以很方便的进行IP地址至字符串形式,32位整行形式 in_addr结构体形式的转换。还有的,可以把本地字节顺序与网络字节顺序进行转换
     1.把一个点分IP转换成一个32位无符号长整型:
         unsigned long inet_addr(const char FAR* cp);
     2.将主机字节顺序转换为网络字节顺序
        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);
     以上有不同的只是有些字节需要转换为long型,比如IP地址,有些只需要short型就可以了,比如PORT号.
     而与上面逆向的函数则有:
        u_long ntohl(u_long netlong);
       int WSANtohl(SOCKET s, u_long netlong, u_long FAR* lphostlong);
      //关于short型的,这里略

三、创建套接字

四、服务器需要调用的的函数及步骤

五、客户端需要调用的函数及步骤

六、数据传输与接收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值