WIN32 Socket API

来源:互联网 发布:js 获取元素父节点 编辑:程序博客网 时间:2024/05/02 01:25

       在Windows网络编程中,套接字接口主要有三种类型:

            1.stream socket (流式套接字)

            2.datagram socket (数据套接字)

            3.raw socket (原始套接字)

       <一> 初始化函数

            int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);

       <二> 创建套接字函数

            SOCKET socket(int af, int type, int protocol);

            [参数]
            af - 地址家族(通常使用:AF_INET)
            type - socket的种类:
               SOCK_STREAM : 用于TCP协议
               SOCK_DGRAM : 用于UDP协议
            protocol - 所使用的协议
          [返回值]
            当函数成功调用时返回一个新的SOCKET(Socket Descriptor)
            失败时返回INVALID_SOCKET.

       <三> 定义套接字后,需要为其指定本机地址,协议,和端口

                bind()函数将套接字绑定到一个已知的地址上,函数原型如下:

                int bind(SOCKET s,const struct sockaddr FAR *name,int namelen);
                [参数]
                s - 指向用Socket函数生成的Socket Descriptor
                addr - 指向Socket地址的指针
                namelen - 该地址的长度.
                [返回值]
               当函数成功调用时返回0
               调用失败时返回 SOCKET_ERROR

       <四> 当服务器端的socket对象绑定后,必须建立一个监听的队列来接收客户端的连接请求。
                调用listen()函数是服务器端的socket进入监听状态,并设定可以建立的最大连接数,

                目前最大值限定为5,最小1,函数原型如下:
                int listen(SOCKET s,int backlog);

       <五> connect()函数用于发送一个连接请求,函数原型如下:

                int connect(SOCKET s,const struct sockaddr FAR *name,int namelen);

                [参数]
               s - 指向用Socket函数生成的Socket Descriptor
               name - 指向服务器地址的指针
               namelen - 该地址的长度.
                [返回值]
               当函数成功调用时返回0
               调用失败时返回 SOCKET_ERROR

        <六> 当客户端提出连接请求时,服务器端要调用accept()函数接受客户端的连接请求。函数

                 原型如下:
                 SOCKET PASCAL FAR accept(SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen);

        <七> 无论客户端还是服务器应用程序都用send()函数来向TCP连接的另一端发送数据。原型如下:
                 int PASCAL FAR send(SOCKET s,const char FAR *buf,int len,int flags);

                 不论客户端还是服务器应用程序都用recv()函数从TCP连接的另一端接收数据。原型如下:
                 int PASCAL FAR recv(SOCKET s,char FAR *buf,int len,int flags);

        <八> 应用程序在使用完套接字以后,需要将其关闭,并释放相关资源。closesocket()函数用于关
                毕一个描述符为s套接字,并释放分配给该套接字的资源,如果s涉及一个正在进行的连接则

                该连接被释放。原型如下:
                BOOL closesocket(SOCKET s);

        <九> 应用程序在使用完socket库后,要调用WSACleanup()hanshu来解除与socket库的绑定并且

                 释放socket库所占用的系统资源。函数原型如下:
                 int WSACleanup(void);

             注:pascal就是__stdcall,参数从右向左压栈,并由函数自己清空堆栈 Win3.x的FAR宏在Win32
                 里面无效。Win32里面都是32位的寄存器,没有FAR和NEAR之分,PASCAL和WINAPI,CALLBACK,
                 APIENTRY 一样,都是指参数的传递方式为__stdcall,而Ansi C默认的参数传递方式为__cdecl,
                 这些宏定义在windef.h里面。FAR 以前定义成far, 是指跨  segment 的存取,x86 在 virtual
                 mode 下 已无 segment 这个东西,所以 FAR 在32 bits VC的定义是空的。 PASCAL 早期定义是
                 pascal 是指函式左边的引数先於右边引数先传(push to stack)并且函式返回时stack的平衡由
                 函式来做(C标准是由 呼叫者平衡)。 这是早期    Winodws为了节省记忆体所使用的calling
                 convention。 现在VC应已不支援pascal呼叫方式。 APIENTRY是定义给一个 thread 的 entry的,
                 它的定义一直都是 和 WINAPI,而WINAPI 的定义是 FAR PASCAL,而FAR PASCAL 已作废。

                        

 

 

原创粉丝点击