WinCE Socket套接字编程

来源:互联网 发布:韩春雨 最新 知乎 编辑:程序博客网 时间:2024/05/12 11:18

Socket套接字编程

  程序员通过调用Sockets的API函数来完成网络通讯程序的编写,有关网络通讯的基础知识参看“桌面Windows网络编程”部分文档。

1 WSAStartup函数用来加载相应版本的Socket动态链接库

int WSAStartup(

  WORD wVersionRequested,

  LPWSADATA lpWSAData

);

wVersionRequested:指定要加载的WinSock库的版本,高位字节指定副版本,低位字节指定主版本。通过MAKEWORD(x,y)宏可以方便获取该参数的正确值,其中x是高位字节,y是低位字节。Windows CE中,最高版本为2.2。

lpWSAData:存储所加载的库的版本信息。WSADATA结构体如下:

typedef struct WSAData {

  WORD wVersion;

  WORD wHighVersion;

  char szDescription[WSADESCRIPTION_LEN+1];

  char szSystemStatus[WSASYS_STATUS_LEN+1];

  unsigned short iMaxSockets;

  unsigned short iMaxUdpDg;

  char FAR* lpVendorInfo;

} WSADATA, *LPWSADATA;

wVersion:打算使用的WinSock库版本。

wHighVersion:存储现有的WinSock库的最高版本。

szDescription和szSystemStatus由特定的WinSock实施方案设定,事实上没有使用。

iMaxSockets和iMaxUdpDg一般不要使用。

lpVendorInfo:为WinSock实施方案有关的厂商预留,可不必关心。

返回值:函数执行成功,返回0,否则返回SOCKET_ERROR,调用WSAGetLastError函数可以得到具体的错误信息。

2  WSACleanup函数与WSAStartup函数配对使用,用来终止对WinSock动态库的使用,同时释放相应的资源。

int  WSACleanup (void);

返回值:函数执行成功,返回0,否则返回SOCKET_ERROR,调用WSAGetLastError函数可以得到具体的错误信息。

 

下面是MSDN上这两个函数使用的示例代码:

——————————————————————————————————

WORD wVersionRequested;

WSADATA wsaData;

int err;

 

wVersionRequested = MAKEWORD( 2, 2 );

 

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

    /* Tell the user that we could not find a usable */

    /* WinSock DLL.                                  */

    return;

}

 

/* Confirm that the WinSock DLL supports 2.2.*/

/* Note that if the DLL supports versions later    */

/* than 2.2 in addition to 2.2, it will still return */

/* 2.2 in wVersion since that is the version we      */

/* requested.                                        */

 

if ( LOBYTE( wsaData.wVersion ) != 2 ||

        HIBYTE( wsaData.wVersion ) != 2 ) {

    /* Tell the user that we could not find a usable */

    /* WinSock DLL.                                  */

    WSACleanup( );

    return;

}

 

/* The WinSock DLL is acceptable. Proceed. */

3 socket函数创建套接字

SOCKET socket(

  int af,

  int type,

  int protocol

);

af:指定地址族,设置为AF_INET即可。

type:指定套接字类型。基于TCP协议的网络程序,该参数设置为SOCK_STREAM;基于UDP协议的网络程序,该参数设置为SOCK_DGRAM。

Protocol:指定协议类型,基于TCP协议的网络程序,该参数可以设置为IPPROTO_TCP;基于UDP协议的网络程序,该参数可以设置为IPPROTO_UDP。通常这个参数可以指定为0,那么系统会根据地址格式和套接字类别,自动选择一个合适的协议。

返回值:函数执行成功,返回新创建的套接字,执行失败,返回INVALID_SOCKET。

如:

SOCKET m_UDPSocket; 

m_UDPSocket = socket(AF_INET, SOCK_DGRAM, 0); /* 创建UDP套接字*/

或者

m_UDPSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

4 closesocket函数关闭套接字

int closesocket(

  SOCKET s

);

当套接字不再使用时,应该通过closesocket函数将其关闭以释放资源。参数s指向socket函数所返回的套接字句柄。

返回值:函数执行成功返回0,执行失败返回SOCKET_ERROR。

5 shutdown函数“从容中断连接”

int shutdown(

  SOCKET s,

  int how

);

当套接字不再使用时,先调用这个函数来禁止发送和接收数据,然后再调用closesocket函数关闭套接字。这样能够防止数据丢失。

s:指定要关闭的套接字。

how:设置为SD_RECEIVE,禁止再调用接收函数;设置为SD_SEND,禁止再调用发送函数;设置为SD_BOTH表示取消收发两端的收发操作。

返回值:函数执行成功返回0,执行失败返回SOCKET_ERROR。