网络编程-Winsock (三)

2014-11-24 01:44:17 · 作者: · 浏览: 12
以网络字节顺序排列。

在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);//初始化套接字库