📄 sy0802.htm
字号:
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p><font color="#0000FF">使用WinSock API</font></p>
<p>(一)实验目的</p>
<p>学习使用WinSock API</p>
<p>(二)实验内容</p>
<p>使用WinSock API建立UDP服务器程序、UDP客户程序、TCP服务器程序、TCP客户程序。</p>
<p>(三)实验步骤</p>
<p>使用Win32 Console Application,源文件中需要包含头文件#include <winsock.h>,在Project->Settings->Link->Object/libray
module中加入库wsock32.lib</p>
<p>1、使用UDP协议</p>
<p>(1)创建服务器程序</p>
<blockquote>
<p> 1.初始化WinSock </p>
<blockquote>
<p>WSADATA WSAData;<br>
WSAStartup(0x101,&WSAData); </p>
</blockquote>
<p>2.创建数据报套接字</p>
<blockquote>
<p>SOCKET myUDPSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);</p>
</blockquote>
<p>3.绑定</p>
<blockquote>
<p>sockaddr_in server;<br>
server.sin_family = AF_INET;<br>
server.sin_addr.s_addr = htonl(INADDR_ANY);<br>
server.sin_port = htons(2003);<br>
bind(myUDPSock,(sockaddr*)&server,sizeof(server));</p>
</blockquote>
<p>4.等待数据</p>
<blockquote>
<p> sockaddr_in client;<br>
char Buffer[128];<br>
int len=sizeof(client);<br>
int retval=recvfrom(myUDPSock,Buffer,sizeof(Buffer),0,(sockaddr*)&client,&len);</p>
</blockquote>
<p>5.关闭套接字</p>
<blockquote>
<p> closesocket(myUDPSock);</p>
</blockquote>
<p>6.清除WinSock</p>
<blockquote>
<p> WSACleanup();</p>
</blockquote>
</blockquote>
<p>(2)创建客户程序</p>
<blockquote>
<p>1.初始化WinSock </p>
<blockquote>
<p>WSADATA WSAData;<br>
WSAStartup(0x101,&WSAData); </p>
</blockquote>
<p>2.创建数据报套接字</p>
<blockquote>
<p>SOCKET myUDPSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);</p>
</blockquote>
<p>3.发送数据</p>
<blockquote>
<p>127.0.0.1表示服务器是本机,如果服务器不是本机,需要指定服务进程所在主机的实际IP地址。</p>
<p>sockaddr_in server;<br>
server.sin_family = AF_INET;<br>
server.sin_addr.s_addr = inet_addr("127.0.0.1"); <br>
server.sin_port = htons(2003);<br>
char Buffer[128];<br>
wsprintf(Buffer,"This is a small test message");<br>
sendto(myUDPSock,Buffer,sizeof(Buffer),0,(sockaddr*)&server,sizeof(server));</p>
</blockquote>
<p>4.关闭套接字</p>
<blockquote>
<p> closesocket(myUDPSock);</p>
</blockquote>
<p>5.清除WinSock</p>
<blockquote>
<p> WSACleanup();</p>
</blockquote>
</blockquote>
<p>完整程序<a href="udp.rar">下载</a></p>
<p></p>
<p>2、使用TCP协议</p>
<p>(1)创建服务器程序</p>
<blockquote>
<p> 1.初始化WinSock </p>
<blockquote>
<p>WSADATA WSAData;<br>
WSAStartup(0x101,&WSAData); </p>
</blockquote>
<p>2.创建数据报套接字</p>
<blockquote>
<p>SOCKET myTCPSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);</p>
</blockquote>
<p>3.绑定</p>
<blockquote>
<p> sockaddr_in server;<br>
server.sin_family = AF_INET;<br>
server.sin_addr.s_addr = htonl(INADDR_ANY);<br>
server.sin_port = htons(2003);<br>
bind(myTCPSock,(sockaddr*)&server,sizeof(server));</p>
</blockquote>
<p>4.监听</p>
<blockquote>
<p>函数原型为:int isten(SOCKET s,int backlog);其中backlog参数指定了正在等待连接的最大队列长度。这个参数非常重要,因为完全可能同时出现几个服务连接请求。例如,假定backlog参数为2。如果三个客户机同时发出请求,那么头两个会被放在一个“待决”(等待处理)队列中,以便应用程序依次为它们提供服务。而第三个连接会造成一个WSAECONNREFUSED错误。注意,一旦服务器接受了一个连接,那个连接请求就会从队列中删去,以便别人可继续发出请求。</p>
<p> listen(myTCPSock,1); //只接受一个连接请求</p>
</blockquote>
<p>5.接受连接</p>
<blockquote>
<p>s为返回与已接受连接对应的套接字,以后这个SOCKET将用于与客户机之间收发信息,关闭s将会关闭这个连接。而原来的套接字仍处于监听状态,以接受其它的连接。client返回这个连接的客户机的信息。</p>
<p>sockaddr_in client;<br>
int len=sizeof(client);<br>
SOCKET s=accept(myTCPSock,(sockaddr*)&client,&len);</p>
</blockquote>
<p>6.等待数据</p>
<blockquote>
<p> char Buffer[128];<br>
int retval=recv(s,Buffer,sizeof(Buffer),0);</p>
</blockquote>
<p> 7.关端连接</p>
<blockquote>
<p> closesocket(s);</p>
</blockquote>
<p>8.关闭套接字</p>
<blockquote>
<p> closesocket(myTCPSock);</p>
</blockquote>
<p>9.清除WinSock</p>
<blockquote>
<p> WSACleanup();</p>
</blockquote>
</blockquote>
<p>(2)创建客户程序</p>
<blockquote>
<p>1.初始化WinSock </p>
<blockquote>
<p>WSADATA WSAData;<br>
WSAStartup(0x101,&WSAData);</p>
</blockquote>
<p>2.创建数据报套接字</p>
<blockquote>
<p>SOCKET myTCPSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);</p>
</blockquote>
<p>3.建立连接</p>
<blockquote>
<p> 127.0.0.1表示服务器是本机,如果服务器不是本机,需要指定服务进程所在主机的实际IP地址。</p>
<p>sockaddr_in server;<br>
server.sin_family = AF_INET;<br>
server.sin_addr.s_addr = inet_addr("127.0.0.1"); <br>
server.sin_port = htons(2004);<br>
connect(myTCPSock,(sockaddr *)&server,sizeof(server));</p>
</blockquote>
<p>4.发送数据</p>
<blockquote>
<p> char Buffer[128];<br>
wsprintf(Buffer,"This is a small test message");<br>
send(myTCPSock,Buffer,sizeof(Buffer),0);</p>
</blockquote>
<p></p>
<p>5.关闭套接字</p>
<blockquote>
<p> closesocket(myTCPSock);</p>
</blockquote>
<p>6.清除WinSock</p>
<blockquote>
<p> WSACleanup();</p>
</blockquote>
</blockquote>
<p>完整程序<a href="tcp.rar">下载</a></p>
<p>3、一个使用TCP协议的聊天例子</p>
<p> 例子分Server和Client两部分,使用基于对话框的应用,利用多线程以避免阻塞。<br>
完整程序<a href="tcp_talk.rar">下载</a> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -