windows TCP socket在C++下的编程入门 2

来源:互联网 发布:三国志15单机还是网络 编辑:程序博客网 时间:2024/04/30 01:42

 接着上一篇中的怎么把端口和IP转换成字节顺序

  幸运的是,我们不需要手动的编译所有的转换函数,好心的微软提供了我们一些API来做这些工作,下面的4个函数就是用来把一个IP或者端口转变成字节:

  u_long PASCAL htonl(u_long); //主机到网络 长整形

  u_long PASCAL ntohl(u_long);//网络到主机 长整形


 u_short PASCAL htons(u_short);//主机到网络 短整形

 u_short PASCAL ntohs(u_short);//网络到主机 短整形


记住!主机电脑是一个监听和邀请和它连接的电脑,网络电脑是和主机电脑连接的拜访者,所以例如,在我们弄清楚哪个端口我们将要去监听和连接的时候,我们不得不使用函数 htons() 来把数字转换成网络字节顺序。注意在使用inet_addr()来转换一个字符串IP地址成要求的格式之后,我们将返回一个正确的字节顺序的地址而不需要使用 htonl() .一个简单的方法来区分什么时候用htons()什么时候用htonl()就是把端口号认为是短整形,IP认为是长整形(IP地址包含4组每组3个数字,端口号只是一个数字)

 激活 Winsock

   现在我们应该大概了解了一些基础的东西了,希望你已经在漆黑的隧道里看到了一点光亮(吐槽下:反正我到这里还是感觉什么都不会,光亮?)让我们继续吧 不要担心现在你不理解程序的每行代码,后面将会不断的补充,慢慢的就有有进步的

  开始windows sockets编程(简称”Winsock“)的第一步就是从Winsock API开始,Winsock有2种版本,版本1是老的,受限制的版本;版本2是最近编辑的。我们这里详细介绍第二种。

     #define SCK_VERSION1   0X0101

    #define  SCK_VERSION2   0X0202

   int PASCAL WSAStartup(WORD,LPWSADATA);

    int PASCAL  WSACleanup(void);

   

  //下面这些定义将用winsock version的返回值信息来填充-->我只是负责翻译的这代码我也看不懂,别问我

    type struct WSAData

    {

      WORD   WVersion;

      WORD   WHighversion;

       char      szDescription[WSADESCRIPTION_LEN+1);

       char       szsystemStatus[WSASYS_STATUS_LEN+1);

       unsigned    short    iMaxSockets;

       unsigned   short      iMaxUdpDG;

       char *             lpvendorInfo;

}

WSDATA;

 typedef WSADATA *LPVendorIndo;


在你初始化Winsock函数之前,以及在你结束调用之后你只需要一个个的调用这些函数。在你结束之前千万别关闭Winsock函数这样会导致取消所有和你程序建立的并初始化的连接或者是任何你正在监听的端口。

  初始化一个 Socket

    现在我们理解了sockets是怎么工作的但是直到现在我们还是不知道怎么初始化它。必须得填入正确的参数并传递给API句柄来开始sockets,在下面这个case中。我们返回我们创造的socket的句柄,这个句柄是非常方便的我们必须要时刻追踪它的位置从而来操控活动的sockets;

  当你做完了所有这些讨厌的工作后便可以考虑适当的编程来关闭任何一个在你退出程序之前打开的sockets,当然,当你这么做的时候所有这个sockets连接的结点都将强制关闭。包括所有的sockets。一个更优雅的方法来关闭它们就是通过使用closesocket(),但你将需要把你使用的socket的句柄传递给closesocket(),当你调用它的时候。

 //除了下面这些定义还有很多,想知道的自己去浏览winsock2.h的头文件

#define SOCK_STREAM 1

#define SOCK_DGRAM 2

#define SOCK_RAM 3

#define AF_INET 2

#define IPPROTO_TCP 6

SOCKET PASCAL socket(int ,int ,int );

int PASCAL closesocket(SOCKET);

 当你创建一个socket的时候,你将需要通过地址簇,socket类型和协议类型。除非你做一些特殊的工作,这个超出范围了不讲。你只是应该典型把AF_INET作为默认的地址簇。这个参数指定了电脑地址怎么被转换的。

有不止一种类型的socket,实际上,还有很多3种最常见的包括:Raw Sockets,Stream Sockets,和Datagram Sockets。其中Stream Sockets就是我们这里用的。因为我们是要处理TCP协议。所以我们要指定SOCK_STREAM作为socket()的第二个参数。

很近了,我们已经很接近了!我们已经开始接触并了解了细节,接下来让我们更多的了解退出的Winsock 编程部分。

     

0 0