关闭

socket编程(3)—— UDP协议通信

标签: udpsocket
267人阅读 评论(0) 收藏 举报
分类:

1 TCP和UDP的区别

  TCP传输数据时,采用的是数据流方式。UDP传输数据时,采用的是数据报方式。
  TCP是有连接协议(基于连接),在数据传输的整个过程,保持服务器和客户端的连接。会重发一切错误数据,因此可以保证数据的正确性和完整性。
  UDP是无连接协议,在数据发送和接收的时候连一下即可,发送/接收完毕就不保持连接。不会重发错误数据,因此UDP有可能丢失数据。

2 UDP编程

  UDP开发没有listen()和accept(),发送和接收函数使用:sendto()和recvfrom(),个别时候可以使用read(),write()基本不能使用。
  sendto()相当于write()+connect()效果,参数是前3个参数和write()一样,第4个参数置0即可,后两个参数和connect()一样。区别:sendto()只是发送时连一下,不会保持连接。而connect()保持连接。
  recvfrom()相当于read()+accept()效果,参数前3个和read()一样,第4个参数置0即可,后两个参数和accept()一样。
  (注意:accept()和connect()的最后一个参数,前者是取地址长度的地址,是个指针,后者就是通信地址的长度)

下面是一个UDP编程实现的时间服务器:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<time.h>
#include<signal.h>
#include<arpa/inet.h>//加的函数的头文件

int sockfd;

void fa(int signo){
    printf("服务器正在关闭!\n");
    sleep(1);
    close(sockfd);
    exit(0);
}

int main(){
    printf("按Ctrl+C退出服务器!\n");
    signal(SIGINT,fa);
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);//网络通信AF_INET
    if (sockfd == -1){
        perror("socket"),exit(-1);
    }

    struct sockaddr_in addr;//网络通信的地址
    addr.sin_family = AF_INET;
    addr.sin_port = htons(2223);//字节顺序本机转网络
    addr.sin_addr.s_addr = inet_addr("192.168.66.11");//点分十进制转十六进制
    int res = bind(sockfd,(struct sockaddr*)&addr,
            sizeof(addr));
    if (res == -1){
        perror("bind"),exit(-1);
    }
    printf("绑定成功\n");

    char buf[100] = {};
    while(1){
        struct sockaddr_in from;
        socklen_t len = sizeof(from);
        res = recvfrom(sockfd,buf,100,0,
                (struct sockaddr*)&from,&len);
        //res = read(sockfd,buf,100);
        memset(buf,0,sizeof(buf));
        time_t cur = time(0);
        struct tm *cu= localtime(&cur);
        sprintf(buf,"%4d-%02d-%02d %02d:%02d:%02d",
            cu->tm_year + 1900,cu->tm_mon + 1,cu->tm_mday,
            cu->tm_hour,cu->tm_min,cu->tm_sec);
        printf("客户端%s连接成功\n",inet_ntoa(from.sin_addr));
        sendto(sockfd,buf,strlen(buf),0,
            (struct sockaddr*)&from,len);
    }
    //close(sockfd);
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main(){
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if (sockfd == -1){
        perror("socket"),exit(-1);
    }

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(2223);//连接端口
    addr.sin_addr.s_addr = inet_addr("192.168.66.11");//都是服务器的,改成连接IP
    int res = sendto(sockfd,"hello",5,0,
            (struct sockaddr*)&addr,sizeof(addr));
    printf("res = %d\n",res);
    char buf[100] = {};
    res = read(sockfd,buf,sizeof(buf));
    printf("%s\n",buf);
    close(sockfd);
    return 0;
}
0
0
查看评论

qt编程:windows下的udp通信

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: #---------...
  • jdh99
  • jdh99
  • 2013-09-22 11:27
  • 11914

基于TCP/IP和UDP协议的socket编程结构解析

1.套接字(socket) socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数...
  • ZhengNice
  • ZhengNice
  • 2016-05-16 21:45
  • 2332

socket编程 -- 基于UDP协议的C/S通信模型及实现

UDP服务端/客户端通信的基本模型由于UDP不需要维护连接,程序逻辑简单了很多。 但是UDP协议是不可靠的,实际上有很 多保证通讯可靠性的机制需要在应用层实现。基于UDP协议的客户端/服务端通信的实现服务端 接收来自客户端的字符串,将小写字母转为大写字符后发送给客户端服务端源码server.c...
  • y396397735
  • y396397735
  • 2016-02-13 20:56
  • 737

基于UDP协议的socket编程

============================================================================= 开发环境:windows 开发工具:VC6.0 注意:由于我们使用的socket编程要使用到ws2_32.lib这个动态库,所以在我们编译...
  • ZhengNice
  • ZhengNice
  • 2016-05-16 22:11
  • 970

Unity3d之Socket UDP协议

(一)Socket(套接字)UDP协议的特点 1、是基于无连接的协议,没有生成连接的延迟所以速度比TCP快; 2、支持一对一和一对多连接,可以使用广播的方式多地址发送; 3、与Tcp的报头比是8:20,所以UDP消耗的网络带宽少; 4、传输的数据有消息边界,Tcp没有; (二)发送 //定义发送...
  • dingkun520wy
  • dingkun520wy
  • 2015-10-17 10:27
  • 9723

Java网络编程实践和总结 --- 基于UDP的Socket编程

前面的blog介绍和总结基于TCP协议的网络编程。TCP提供了一种可靠的传输方式。如果数据在传输过程丢失或者损坏了,TCP会保证数据会再次发送,直到数据完整接受。如果数据包以乱序到达目的地,TCP也会根据数据包的原始顺序将其正常排序。如果传输的速度过快而导致数据丢包,TCP也会自动地调整速度,保证稳...
  • joeyjobs
  • joeyjobs
  • 2015-04-02 19:54
  • 1754

android编程3:socket编程之udp发送

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 环境:win7 + eclipse + sdk 代码:
  • jdh99
  • jdh99
  • 2011-08-15 10:50
  • 13607

UDP通讯

UDP:全称User Data Protocol( 用户数据报协议) :将数据及源和目的封装成数据包中,每个包的大小限制在64k内,因为无连接所以是不可靠协议,但速度快。 用UDP实现通讯需要建立一个发送端和一个接收端 创建发送端 1、建立udp的socket服务。 2、将要发送的数据封...
  • zhong1113
  • zhong1113
  • 2014-03-19 22:31
  • 1174

Android Socket通信(一)--基于UDP协议通信

最近做功能需要用到使用UDP协议和服务器进行通信,之前没有接触这一块,所以花了些时间了解和实现,这里做一下记录和分享。
  • lizebin_bin
  • lizebin_bin
  • 2017-03-16 15:03
  • 2724

实现可靠UDP通信的两种方式

实现可靠UDP通信的两种方式众所周知UDP通信协议是不可靠的通信协议,其可靠性必须由上层应用实现。一般都会采用消息重传来实现其可靠性,采用消息重传的时候有两种方式,一种是发送者发起,另一种是接收者发起。对于发送者发起的方式,一般情况下接收者会发送一个消息包的确认。发送者维护一个计时器并重传那些在某个...
  • plusboy
  • plusboy
  • 2007-03-07 15:29
  • 6737
    个人资料
    • 访问:100598次
    • 积分:1975
    • 等级:
    • 排名:千里之外
    • 原创:92篇
    • 转载:20篇
    • 译文:0篇
    • 评论:3条
    博客公告
    最新评论