【第22期】观点:IT 行业加班,到底有没有价值?

socket之无连接编程(UDP)

原创 2016年06月01日 16:06:37

UDP是无连接不可靠的数据报协议,UDP的常见应用程序是DNS(域名解析系统),NFS(网络文件系统),SNMP(简单网络管理协议);

在使用UDP的客户服务器程序中,客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指出目标服务器的地址;同样,服务器不接受来自客户的连接,而只是用recvfrom等待指定用户的数据到达,recvfrom将与所接收的数据报一起返回客户的协议地址,因此服务器可以把响应发送给正确的客户!!!!

注意:在UDP服务中,必须先由客户发送数据给服务器,这样服务器才会知道自己在为哪个客户服务

编写UDP无连接的客户服务器套接字流程如下:

这里写图片描述

以下是一个UDP实现的客户服务器发送数据报的简单例子:

//服务器端的代码
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT  7070
#define SERVER_IP   "192.168.3.66"


int main(int ac, char *av[])
{
    int sockser = socket(AF_INET, SOCK_DGRAM, 0);   //创建服务器端的套接字
    if(sockser == -1){
        perror("socket");
    }

    //设置地址重用
    int y=1;
    setsockopt(sockser, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int));

    struct sockaddr_in addrser, addrcli;    //客户服务器的地址结构体
    addrser.sin_family = AF_INET;    //设置服务器端的协议家族
    addrser.sin_port = htons(SERVER_PORT);   //设置服务器的端口号
    addrser.sin_addr.s_addr = inet_addr(SERVER_IP);  //设置服务器的IP地址

    socklen_t addrlen = sizeof(struct sockaddr);   //得到客户服务器的地址长度
    int res = bind(sockser, (struct sockaddr*)&addrser, addrlen);   //绑定服务器的地址信息
    if(res == -1){
        perror("bind");
    }

    char sendbuf[256];
    char recvbuf[256];
    printf("wait cli connect.......\n");
    //收发数据进行服务
    while(1){
        recvfrom(sockser, recvbuf, 256, 0, (struct sockaddr*)&addrcli, &addrlen);    //接收来自目标客户的数据报
        printf("cli:>%s\n", recvbuf);


        printf("Ser:>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){
            sendto(sockser, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr*)&addrcli, addrlen);   //给目标客户发送数据报
            break;
        }
        sendto(sockser, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr*)&addrcli, addrlen);
    }

    close(sockser);   //关闭服务器的套接字
    return 0;
}


//客户端的代码
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT  7070
#define SERVER_IP   "192.168.3.66"


int main(int ac, char *av[])
{
    int sockcli = socket(AF_INET, SOCK_DGRAM, 0);    //得到客户端的套接字
    if(sockcli == -1){
        perror("socket");
    }

    struct sockaddr_in addrser;    //服务器端的地址结构体
    addrser.sin_family = AF_INET;    //设置服务器的地址协议家族
    addrser.sin_port = htons(SERVER_PORT);   //设置服务器的端口号
    addrser.sin_addr.s_addr = inet_addr(SERVER_IP);   //设置服务器的IP地址

    socklen_t addrlen = sizeof(struct sockaddr);   //得到服务器的地址长度

    char sendbuf[256];
    char recvbuf[256];
    printf("cli connect ser ok.\n");
    //收发数据
    while(1){
        printf("Cli:>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){
            sendto(sockcli, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr*)&addrser, addrlen);  //客户端首先发送数据报,为了让服务器确认通信的客户
            break;
        }
        sendto(sockcli, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr*)&addrser, addrlen);
        recvfrom(sockcli, recvbuf, 256, 0, (struct sockaddr*)&addrser, &addrlen);   //客户端接收来自服务器的数据报
        printf("Ser:>%s\n", recvbuf);
    }

    close(sockcli);  //关闭客户端套接字
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

基于UDP(面向无连接)的socket编程

最近在学网络编程,当是记一下笔记

Socket编程---使用无连接的数据报(UDP) 进行通信

    使用无连接的数据报(UDP) 进行通信 什么是Datagram?数据报是网上传输的独立数据包 ,数据报是否能正确地到达目的地,到达的时间,顺序,内容的正确性均没有保障。 java中使用Datagram与DatagramPacket类DatagramSocket类利用UDP协议来实现客户与服务器的Socket.send():发送数据报receive(): 接收数据报    以下为流程   <img src="http

基于UDP(面向无连接)的socket编程

Socket编程 (连接,发送消息) (Tcp、Udp)

Socket编程 (连接,发送消息) (Tcp、Udp)  本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式。(服务器端与客户端的通讯)   1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息

UDP(面向无连接)的socket编程

服务器端(接收端)程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、等待接收数据(recvfrom)。 4、关闭套接字。客户端(发送端)程序:...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)