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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

基于面向连接和无连接的socket编程

基于面向连接的socket编程 基于面向连接的socket编程就是基于TCP的socket编程。基于TCP的socket编程的服务器器端程序和客户端程序的流程如下: 服务器端程序 1、创建套接字...

通信协议:HTTP、TCP、UDP

TCP HTTP UDP三者的关系: TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议...

TCP-UDP-连接-无连接

简述: TCP/IP 的学习过程中不可避免两个协议TCP与UDP协议,同时也不可避免这句话“TCP面向连接,UDP面向无连接”,同样困扰了我好久,接下来说说我的理解。 详述: 假设服务器S给客户...

基于面向连接和无连接的socket编程

基于面向连接的socket编程 基于面向连接的socket编程就是基于TCP的socket编程。基于TCP的socket编程的服务器器端程序和客户端程序的流程如下: 服务器端程序 1、创建套接字...

用C语言实现一个简单的HTTP客户端(HTTP Client)

  用C语言实现一个简单的HTTP Client(HTTP客户端)  作者:gobitan(雨水) 日期:2007-04-03 转载请注明出处http://blog.csdn.net/gobitan ...
  • gobitan
  • gobitan
  • 2007年04月03日 23:30
  • 37800

socket 编程TCP,UDP建立连接过程详解

1,TCP是面向连接的协议,建立的过程使用三次握手协议,大概过程是客户机发送数据请求给服务机,告诉服务机,我有数据需要发送,服务机收到请求,发送一个确认请求回复,告诉客户机你发的请求我已经收到,客户机...

Socket编程 (连接,发送消息) (Tcp、Udp) ,这个是同步,跟上一篇差不多

Socket编程 (连接,发送消息) (Tcp、Udp)  本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式。(服务器端与客户端的通讯)   1.基于Tcp协议的Socke...

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

http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html 本篇文章主要实现Socket在Tcp\Udp协议...

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

最近在学网络编程,当是记一下笔记
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket之无连接编程(UDP)
举报原因:
原因补充:

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