美文网首页
Linux下Socket编程(六)——udp

Linux下Socket编程(六)——udp

作者: 第八区 | 来源:发表于2017-09-27 18:02 被阅读53次

简介

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

udp协议

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

2.jpg

udp通信流程

1.jpg

示例

  • 运行服务端
  • 运行客户端,客户端等待用户输入,回车后,消息发出到服务端,服务端接受数据并打印。
  • 客户端输入 exit后自动退出。
server
#include <iostream>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
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"<<endl;
        }
        char buf[BUFF_LEN]; //接收缓冲区,1024字节
        int recvRet;
        sockaddr_in clientAddr;
        socklen_t len=sizeof(clientAddr);
        char clientIp[16]={0};
        while (true) {
                /* code */
                memset(buf,0,BUFF_LEN);
                //0表示对方关闭,-1为发生错误。
                recvRet=recvfrom(sock,buf,BUFF_LEN,NULL,(sockaddr *)&clientAddr,&len);
                if(recvRet<=0) {
                        cout<<"receive failed"<<endl;
                        break;
                }else{
                        memset(clientIp,0,sizeof(clientIp));
                        int clientPort=ntohs(clientAddr.sin_port);
                        inet_ntop(AF_INET,(void *)&clientAddr.sin_addr,clientIp,16);
                        cout<<"receive data from "<<clientIp<<":"<<clientPort<<endl;
                        cout<<buf<<endl;
                }
        }
        if(sock>0) {
                close(sock);
        }
        return 0;
}
client
#include <iostream>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
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"<<endl;
                        }
                }
        }
        if(sock>0) {
                close(sock);
                sock=-1;
        }
        return 0;
}

相关文章

  • Linux下Socket编程(六)——udp

    简介 udp协议 udp通信流程 示例 udp协议 中文叫用户数据报协议,属于传输层。UDP是面向非连接的协议,它...

  • UDP

    Linux C编程 socket——Udp组播(多播)[https://www.jianshu.com/write...

  • 网络编程

    网络 Socket 基于TCP协议的Socket编程 基于UDP协议的Socket编程

  • Linux下的Socket编程(主要包括TCP部分)

    Linux下的Socket编程(主要包括TCP部分) 转载麻烦注明原文地址本文是Linux下基本的Socket编程...

  • Linux网络编程之UDP Socket程序示例

    仅为方便查看,搬运一下,也可看原文 这篇文章主要介绍了Linux网络编程之UDP Socket程序示例,有助于读者...

  • 浅谈 Linux C语言 socket 网络编程

    Linux C语言socket网络编程 注意:本文是按照 TCP、UDP的工作过程进行总结的 TCP套 sock...

  • 网络编程

    Linux Socket编程(不限Linux) C/C++ socket编程教程:1天玩转socket通信技术 一...

  • Java socket

    Java Socket实现基于TCP和UDP多线程通信Java Socket编程

  • (三)即时通讯系列之UDPSocket

    即时通讯系列之Socket简介 转自他人 1. UDP Socket编程 先讲一讲UDP编程,因为比TCP要简单多...

  • Day18总结

    一.网络通信过程TCP协议和UDP协议二.socket编程 1.socket编程定义:socket又叫套接字。指的...

网友评论

      本文标题:Linux下Socket编程(六)——udp

      本文链接:https://www.haomeiwen.com/subject/zqauextx.html