在Winsock 中提供了几个关于网络字节顺序与主机字节顺序之间的转换函数。函数定义如下:
本地字节顺序转换为网络字节顺序:
[cpp] u_short htons( u_short hostshort );
u_long htonl( u_long hostlong );
unsigned long inet_addr( const char FAR *cp );unsigned long inet_addr( const char FAR *cp );//将一个字符串IP转换到以网络字节顺序排列的IP地址
u_short htons( u_short hostshort );
u_long htonl( u_long hostlong );
unsigned long inet_addr( const char FAR *cp );unsigned long inet_addr( const char FAR *cp );//将一个字符串IP转换到以网络字节顺序排列的IP地址 网络字节顺序转换为本地字节顺序:
[cpp]
[cpp] u_short ntohs( u_short netshort );
u_long ntohl( u_long netlong );
char FAR * inet_ntoa( struct in_addr in );//将一个以网络字节顺序排列的IP地址转换为衣蛾字符串IP
u_short ntohs( u_short netshort );
u_long ntohl( u_long netlong );
char FAR * inet_ntoa( struct in_addr in );//将一个以网络字节顺序排列的IP地址转换为衣蛾字符串IP
简单的通信程序:
下面我们用Windock 写一个基于TCP和UDP的“Hello World”小程序。
基于TCP协议的“Hello World !”
服务器端代码编写的流程如下:
[cpp] WSAStartup() -> socket() -> bind() -> listen() -> accept() -> send() / recv() ->closesocket() -> WSACleanup()
WSAStartup() -> socket() -> bind() -> listen() -> accept() -> send() / recv() ->closesocket() -> WSACleanup() 只要把这些函数依次写完,服务器端的代码就写完了。
服务器端代码如下:
[cpp] #include<windows.h>
#pragma comment (lib, "ws2_32")//显式连接套接字库
int main(int argc, char *argv)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);//初始化套接字库
SOCKET s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in socketaddr;
socketaddr.sin_family = PF_INET;
socketaddr.sin_addr.S_un.S_addr = inet_addr("127.1.1.0");
socketaddr.sin_port = htons(827);
bind(s,(SOCKADDR*)&socketaddr,sizeof(SOCKADDR));
listen(s,1);
SOCKADDR clientAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clientSock;
clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
send(clientSock,"hello client \r\n",strlen("hello client \r\n")+sizeof(char),NULL);
closesocket(clientSock);
closesocket(s);
WSACleanup();//释放套接字库
return 0;
}
#include
#pragma comment (lib, "ws2_32")//显式连接套接字库
int main(int argc, char *argv)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);//初始化套接字库
SOCKET s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in socketaddr;
socketaddr.sin_family = PF_INET;
socketaddr.sin_addr.S_un.S_addr = inet_addr("127.1.1.0");
socketaddr.sin_port = htons(827);
bind(s,(SOCKADDR*)&socketaddr,sizeof(SOCKADDR));
listen(s,1);
SOCKADDR clientAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clientSock;
clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
send(clientSock,"hello client \r\n",strlen("hello client \r\n")+sizeof(char),NULL);
closesocket(clientSock);
closesocket(s);
WSACleanup();//释放套接字库
return 0;
}
客户端的代码编写流程如下:
[cpp] WSAStartup() -> socket() -> connect() -> send() / recv() ->closesocket() -> WSACleanup()
WSAStartup() -> socket() -> connect() -> send() / recv() ->closesocket() -> WSACleanup()
客户端的流程比服务端的流程要少一些,主要是省去了绑定IP和端口、监听等一些步骤。
客户端代码如下:
[cpp] #include
#include
#pragma comment (lib,"ws2_32")//显示连接套接字库
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);//初始化套接字库