Linux下Socket编程(六)——udp

简介

  • udp协议
  • udp通信流程
  • 示例

udp协议

中文叫用户数据报协议,属于传输层。UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对方。所以UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。正因为UDP无需建立类如三次握手的连接,而使得通信效率很高。

Linux下Socket编程(六)——udp_第1张图片
2.jpg

udp通信流程

Linux下Socket编程(六)——udp_第2张图片
1.jpg

示例

  • 运行服务端
  • 运行客户端,客户端等待用户输入,回车后,消息发出到服务端,服务端接受数据并打印。
  • 客户端输入 exit后自动退出。
server
#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define BUFF_LEN 1024
int main(){
        int sock=socket(AF_INET,SOCK_DGRAM,0);
        int ret=0;
        sockaddr_in addr;
        addr.sin_family=AF_INET;
        //本地Ip
        addr.sin_addr.s_addr=htonl(INADDR_ANY);
        addr.sin_port=8888;
        ret=bind(sock,(sockaddr*)&addr,sizeof(addr));
        if(ret<0) {
                cout<<"bind failed"<0) {
                close(sock);
        }
        return 0;
}
client
#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define BUFF_LEN 1024
int main(){
        int sock=socket(AF_INET,SOCK_DGRAM,0);
        int ret=0;
        sockaddr_in addr;
        addr.sin_family=AF_INET;
        //INADDR_ANY为本地Ip
        addr.sin_addr.s_addr=htonl(INADDR_ANY);
        addr.sin_port=8888;

        char buf[BUFF_LEN]={0};
        int recvRet;
        //0表示对方关闭,-1为发生错误。
        while (true) {
                //标准输入,会带上'\n'
                fgets(buf,BUFF_LEN,stdin);
                if(string(buf)=="exit\n") {
                        break;
                }else{
                        recvRet=sendto(sock,buf,strlen(buf),NULL,(sockaddr *)&addr,sizeof(addr));
                        if(recvRet<=0) {
                                cout<<"receive failed"<0) {
                close(sock);
                sock=-1;
        }
        return 0;
}

你可能感兴趣的:(Linux下Socket编程(六)——udp)