⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sy0802.htm

📁 c语言经典教程
💻 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 &lt;winsock.h&gt;,在Project-&gt;Settings-&gt;Link-&gt;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*)&amp;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*)&amp;client,&amp;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(&quot;127.0.0.1&quot;); <br>
      server.sin_port = htons(2003);<br>
      char Buffer[128];<br>
      wsprintf(Buffer,&quot;This is a small test message&quot;);<br>
      sendto(myUDPSock,Buffer,sizeof(Buffer),0,(sockaddr*)&amp;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*)&amp;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*)&amp;client,&amp;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(&quot;127.0.0.1&quot;); <br>
      server.sin_port = htons(2004);<br>
      connect(myTCPSock,(sockaddr *)&amp;server,sizeof(server));</p>
  </blockquote>
  <p>4.发送数据</p>
  <blockquote> 
    <p> char Buffer[128];<br>
      wsprintf(Buffer,&quot;This is a small test message&quot;);<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 + -