`

UDP套接字

 
阅读更多
UDP:是无连接不可靠的数据报协议,一些常见的程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议).

UDP和TCP在首部中都有覆盖它们首部和数据的检验和.UDP的检验和是可选的,而TCP的检验和是必需的.如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃.不产生任何差错报文.其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动

udp中也有connect:但一般只有在使用自己的套接字与确定的唯一对端进行通信时,才可以调用connect.调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户端长时间通信,这时,客户和服务器都可能调用connect

udp套接字不存在真正的发送缓冲区,内核只是复制应用进程数据并把它沿协议栈向下传送,渐次冠以UDP首部和IP首部.

udpserver.cpp
#include"unp.h"
#include<iostream>
using namespace std;

void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
    int n;
    socklen_t len;
    char mesg[MAXLINE];
    bzero(mesg,MAXLINE);
    for(;;){
        len = clilen;
        n = recvfrom(sockfd,mesg,MAXLINE,0,pcliaddr,&len);
        cout << mesg << endl;
        sendto(sockfd,mesg,n,0,pcliaddr,len);
    }
}

int main(int argc,char ** argv)
{
    int sockfd;
    struct sockaddr_in servaddr,cliaddr;
    bzero(&servaddr,sizeof(servaddr));
    bzero(&cliaddr,sizeof(cliaddr));
    sockfd = socket(AF_INET,SOCK_DGRAM,0);
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
    bind(sockfd,(SA *)&servaddr,sizeof(servaddr));

    dg_echo(sockfd,(SA*)&cliaddr,sizeof(cliaddr));
}



udpclient
#include"unp.h"
#include<stdio.h>

int main(int argc,char ** argv)
{
    int sockfd;
    struct sockaddr_in servaddr;
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET,"192.168.5.178",&servaddr.sin_addr);
    sockfd = socket(AF_INET,SOCK_DGRAM,0);
    dg_cli(stdin,sockfd,(SA*)&servaddr,sizeof(servaddr));
    exit(0);
}

void dg_cli(FILE *fp, int sockfd, const SA * pservaddr, socklen_t servlen)
{
    int n;
    char sendline[MAXLINE],recvline[MAXLINE+1];
    while(fgets(sendline,MAXLINE,fp)!=NULL){
        sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);
        n = recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL);
        recvline[n] = 0;
        fputs(recvline,stdout);
    }
}



编译client:
1.g++ -c udpclient.cpp
2.g++ -o udpclient udpclient.o

效果图:左下角是在跑的服务器,右边是在命令行跑的客户端,如果你找不到unp.h头文件,那么它出自unix网络编程(129块,比代码大全还贵一块),还有哪本圣经比它更贵的告诉我下...谢谢!



select版
#include"unp.h"
#include"sys/types.h"

int main()
{
    int listenfd,connfd,udpfd,nready,maxfdp1;
    char mesg[MAXLINE];
    pid_t childpid;
    fd_set rset;
    ssize_t n;
    socklen_t len;
    const int on = 1;
    struct sockaddr_in cliaddr,servaddr;
    void sig_chld(int);

    listenfd = socket(AF_INET,SOCK_STREAM,0);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
    listen(listenfd,LISTENQ);

    udpfd = socket(AF_INET,SOCK_DGRAM,0);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    bind(udpfd,(SA *)&servaddr,sizeof(servaddr));
    //signal(SIGCHLD,sig_chld);
    FD_ZERO(&rset);

    maxfdp1 = max(listenfd,udpfd)+1;
    for(;;){
        FD_SET(listenfd,&rset);
        FD_SET(udpfd,&rset);
        if((nready = select(maxfdp1,&rset,NULL,NULL,NULL))<0){
            if(errno == EINTR)
                continue;
            else
                perror("select error");
        }
        if(FD_ISSET(listenfd,&rset)){
            len = sizeof(cliaddr);
            connfd = accept(listenfd,(SA *)&cliaddr,&len);
            if((childpid = fork())==0){
                close(listenfd);
                //str_echo(connfd);
                exit(0);
            }
            close(connfd);
        }
        if(FD_ISSET(udpfd,&rset)){
            len = sizeof(cliaddr);
            n = recvfrom(udpfd,mesg,MAXLINE,0,(SA *)&cliaddr,&len);
            sendto(udpfd,mesg,n,0,(SA *)&cliaddr,len);
        }
    }
}


  • 大小: 72 KB
分享到:
评论

相关推荐

    UDP套接字详解

    ### UDP套接字详解 #### 一、基本概念与特点 **UDP套接字**是一种基于TCP/IP协议的网络通信模型中的重要组成部分,它支持无连接的通信模式。与TCP套接字不同的是,UDP不提供可靠的数据传输,即不保证数据包能够按...

    UDP 套接字连接

    总结来说,理解UDP套接字连接的关键在于掌握如何创建和使用UDP套接字,以及如何在无连接的情况下正确地发送和接收数据。在实际应用中,UDP常用于实时性要求高、对数据完整性和顺序性不敏感的场景,如视频流传输、...

    UDP套接字实例.

    ### UDP套接字实例知识点详解 #### 一、UDP套接字概述 用户数据报协议(User Datagram Protocol,UDP)是一种无连接的传输层协议,主要用于那些对传输速度要求较高而对可靠性要求较低的应用场景。UDP套接字是用于...

    头歌UDP Ping程序实现-客户端创建UDP套接字

    头歌UDP Ping程序实现-客户端创建UDP套接字头歌UDP Ping程序实现-客户端创建UDP套接字头歌UDP Ping程序实现-客户端创建UDP套接字头歌UDP Ping程序实现-客户端创建UDP套接字头歌UDP Ping程序实现-客户端创建UDP套接...

    头歌第1关:Ping服务端创建UDP套接字

    第1关:Ping服务端创建UDP套接字第1关:Ping服务端创建UDP套接字第1关:Ping服务端创建UDP套接字第1关:Ping服务端创建UDP套接字第1关:Ping服务端创建UDP套接字第1关:Ping服务端创建UDP套接字第1关:Ping服务端...

    用套接字实现udp传输,c++源码

    本文将对用套接字实现UDP传输的C++源码进行详细分析,从标题、描述、标签和部分内容四个方面入手,深入探讨UDP套接字的工作原理、客户端和服务器端代码实现、重要函数和变量的作用等方面。 标题和描述 标题“用套...

    网络编程套接字 - UDP套接字

    网络编程中的UDP套接字是基于用户数据报协议(User Datagram Protocol)的一种通信方式,它在互联网协议族中扮演着重要角色。UDP是一种无连接、不可靠的传输协议,相较于TCP,它更注重效率和速度,但不保证数据的...

    Python基于UDP协议的套接字通信,网络编程必看

    - 首先,导入socket模块并创建一个UDP套接字对象,使用socket.SOCK_DGRAM指定UDP协议。 - 绑定本地IP地址和端口号,这使得服务端可以监听特定的网络接口和端口,等待来自客户端的数据。 - 使用socket的recvfrom...

    windows下的udp套接字c源码用例例子

    UDP套接字在C语言中编程时,主要涉及以下知识点: 1. **套接字API**: Windows操作系统提供了Winsock库来支持套接字编程。在C语言中,我们需要引入`winsock2.h`头文件,并在程序开始时调用`WSAStartup`函数初始化套...

    C#实现UDP套接字的通讯

    在IT领域,网络通信是应用程序之间交互的重要方式。在C#编程中,我们可以使用System.Net...在给定的slnSocket压缩包文件中,可能包含了这个项目的源代码,进一步的分析和学习将有助于深入理解UDP套接字通信的实现细节。

    TCP和UDP套接字_简单的客户/服务器

    在IT领域,网络通信是核心部分之一,而TCP(传输控制协议)和UDP(用户数据报协议)则是两种主要的传输层协议。本主题聚焦于如何利用这两种协议设计一个简单的客户/服务器系统,并涉及到多线程编程技术。下面将详细...

    UDP-chat.rar_UDP 套接字 聊天

    在这个"UDP-chat.rar"项目中,我们看到的是一个利用UDP套接字实现的简单聊天程序,旨在帮助学习者掌握UDP套接字的基本用法。 在UDP中,数据是以数据报的形式发送的,每个数据报都有完整的源和目的地址,可以独立于...

    Windows下UDP套接字聊天小软件

    【标题】:“Windows下UDP套接字聊天小软件”是一个基于UDP协议的简易通信程序,专为初学者设计,用于理解套接字编程的基本概念和操作。它在Windows操作系统环境下运行,通过设置客户端代码中的IP地址,使得不同...

    udp和tcp套接字简单例子

    **UDP套接字示例** 1. 创建套接字:`socket()`函数创建一个套接字。 2. 绑定套接字:`bind()`函数将套接字与本地地址关联。 3. 发送数据:`sendto()`函数向指定的远程地址发送数据。 4. 接收数据:`recvfrom()`函数...

    liaotian.rar_UDP_使用UDP套接字编程_在局域网中进行点对点聊天的程序_聊天 点对点

    1. **UDP套接字的创建**:在Java中,我们可以使用`java.net.DatagramSocket`类来创建UDP套接字。这个类提供了发送和接收数据报包的功能。首先,我们需要创建一个`DatagramSocket`实例,指定一个端口号,这个端口号...

    基本UDP套接口编程

    在UDP套接字编程中,主要涉及以下几个函数: - **`recvfrom()`**:接收来自UDP套接字的数据。 - 参数: - `sockfd`:套接字文件描述符。 - `buff`:用于存储接收数据的缓冲区指针。 - `nbytes`:缓冲区大小。 ...

    DUP套接字客户端

    在本程序中,"DUP套接字客户端"利用UDP套接字实现了一个简单的发送数据的功能,这通常用于需要快速传输而不关心数据是否丢失或重复的场景,如在线视频流、实时游戏等。 首先,让我们深入理解UDP套接字的工作原理。...

    PythonUDPstreamer-tool:基于python的UDP套接字视频流

    PythonUDPstreamer-tool 是一个基于Python的开源工具,专门用于通过UDP套接字进行实时视频流传输。在无线网络和WiFi环境下,这种工具特别有用,因为它可以高效地处理数据包丢失,同时保持较低的延迟,确保视频流的...

    Windows套接字广播编程实例

    2. **创建套接字**:使用`socket`函数创建一个UDP套接字,指定协议类型为`AF_INET`(IPv4)和`SOCK_DGRAM`(UDP)。 3. **绑定套接字**:通过`bind`函数将套接字绑定到本地端口,以便接收和发送数据。 4. **设置广播...

Global site tag (gtag.js) - Google Analytics