网络编程-UDP协议的简单示例(P)

网络编程-UDP协议的简单示例(P)_第1张图片

 

1.关于udp:

udp相对于tcp而言,它是不可靠的协议,不是有话说,“任何存在的东西总有其优点所在”吗?udp虽然可靠性不够高,但传输效率却很高,速度也很快,所以用的也很多。

2.通信前的注意工作:

因为采用基于windows套接口的编程,通信前,要进行初始化Windows Sockets服务。

⑴用WSAStartup()函数对windowsSocketsDLL进行初始化。

⑵在调用Windock函数之前,需要加载Wincock库

                 #include "winsock.h"
                 #include "afxsock.h"

⑶WSAStartup()与WSACleanup()是成对出现的,前者是分配资源,后者则是释放资源。

3.采用C/S模型,先分析服务器程序

 if(m_hSocket!=NULL)
 {
  closesocket(m_hSocket);//若已经建立了套接字,先关闭
  m_hSocket=NULL;
 }
 if(m_hSocket==NULL)
 {
  m_hSocket=socket(AF_INET,SOCK_DGRAM,0);//创建数据报套接字
  ASSERT(m_hSocket!=NULL);
 }
 UpdateData();

 m_addr.sin_family=AF_INET;
 m_addr.sin_addr.S_un.S_addr=INADDR_ANY;
 m_addr.sin_port=htons(m_port);//htons:主机字节顺序转为网络字节顺序

 int ret=0;
 int error=0;
 ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));//绑定套接字到本机地址
 if(ret==SOCKET_ERROR)//判断绑定正确与否
 {
  TRACE("bind error:%d/n",(error=WSAGetLastError()));
  return;
 }
 char buff[256];
 SOCKADDR_IN from;
 int fromlen=sizeof(from);
 ret=recvfrom(m_hSocket,buff,256,0,(LPSOCKADDR)&from,&fromlen);//数据接收函数,参数5为[out],是源目的地址。
 buff[ret]=0;
 if(ret>0)
  MessageBox(buff);
 else MessageBox("没有收到数据!");
 
 char *buf=buff;
 char *temp="-回执!";
 strcat(buf,temp);
 ret=sendto(m_hSocket,buf,strlen(buf),0,(LPSOCKADDR)&from,sizeof(from));//数据发送函数
 if(m_hSocket!=NULL)
  closesocket(m_hSocket);//关闭套接字

 

 

4.客户端程序如下:

  if(m_hSocket!=NULL)
 {
  closesocket(m_hSocket);//若已经建立了套接字,先关闭
  m_hSocket=NULL;
 }
 if(m_hSocket==NULL)
 {
  m_hSocket=socket(AF_INET,SOCK_DGRAM,0);//创建数据报套接字
  ASSERT(m_hSocket!=NULL);
 }
 UpdateData();
 m_addr.sin_family=AF_INET;
 m_addr.sin_addr.S_un.S_addr=inet_addr(m_serverip.GetBuffer(0));
 m_addr.sin_port=htons(m_port);//htons:主机字节顺序转为网络字节顺序
 int ret=0;
 int addrlen=sizeof(m_addr);
 CString str;
 str += char(m_name.GetLength());
 str += m_name;
 str += char(m_pass.GetLength());
 str += m_pass;
 char* buf = str.GetBuffer(0);
 ret = sendto(m_hSocket, buf, str.GetLength(),0,(LPSOCKADDR)&m_addr,addrlen);//数据发送函数,注意全部的参数都是[in]
 if(ret>0)
  MessageBox("数据已发送...");
 char buff[256];
 ret = recvfrom(m_hSocket,buff,256,0,(LPSOCKADDR)&m_addr,&addrlen);//数据接受函数,参数5为[out],参数6为[in/out]
 if(ret>0)
 {
  buff[ret] = '/0';
  MessageBox(buff);// TODO: Add extra validation here
 }
 else
  MessageBox("没有回执消息,可能服务器程序没启动!");
 if(m_hSocket!=NULL)
  closesocket(m_hSocket);//关闭套接字

5.总结:

TCP与UDP协议,通信过程要注意。

在服务器程序中,TCP协议通信中,需要调用listen()监听,accept()准备接受连接,而UDP中,则没有这两个函数,它只需要等待接受数据。

而在客户端,TCP需要用到connect函数,UDP不需要(如果用到connect,虽然后面的发送和接受函数可以不用写源目的地址,但其协议仍然是无连接的)。

 

你可能感兴趣的:(网络编程-UDP协议的简单示例(P))