Windows网络编程

 

一、Winsock初始化

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

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

int WSAStartup(WORD wVersionRequested,
         LPWSADATA lpWSAData);

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

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

    具体的代码:
   

#include "winsock2.h"
int main()
{
    WSADATA wsaData;
    
int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
    
if(Ret != 0)
    
{
      cout
<<"无法初始化winsock."<<endl;
    }

    
else
      cout
<<"初始化winsock成功"<<endl;

     
//..
 
     
if(WSACleanup()==SOCKET_ERROR)
     
{
       cout
<<"WSAData无法cleanup.";
     }

     
return 0;
}

 

二、IPv4结构体

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

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

还有一些其它的函数,可以很方便的进行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型的,这里略

三、创建套接字

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

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

六、数据传输与接收

posted @ 2007-05-22 23:56  shipfi  阅读(415)  评论(0编辑  收藏