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

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,虽然后面的发送和接受函数可以不用写源目的地址,但其协议仍然是无连接的)。

 


 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值