socket——UDP服务器

UDP在socket编程中和TCP的不同

  1. UDP是无连接的传输,因此并不需要建立连接,不需要监听是否有客户端发送连接请求(具体到socket编程中即UDP不需要listen()和accept())
  2. UDP采用面向数据报方式(socket()的第二个参数是SOCK_DGRAM)
  3. UDP可能会丢包,也不保证数据顺序性(QQ上有时候消息在发送端和接收端的顺序不一样)
  4. UDP收发数据用sendto/recvfrom函数,每次sendto/recvfrom均需指定地址信息(这一点TCP服务器中在connect/accept时确定)
  5. UDP  shutdown函数无效

服务器端程序:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

void usage(char *proc)
{
    printf("%s [ip] [port]\n",proc);
}

int main(int argc,char *argv[])
{
    if(argc!=3){
        usage(argv[0]);
        return 1;
    }   
    //创建套接字
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0){
        perror("socket");
        return 1;
    }

    int _port=atoi(argv[2]);
    char *_ip=argv[1];

    struct sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_port=htons(_port);
    local.sin_addr.s_addr=inet_addr(_ip);
    
    //绑定
    if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){
        perror("bind");
        return 2;
    }

    char buf[1024];

    struct sockaddr_in client;
    socklen_t client_len;
    while(1){
            //接收数据
        ssize_t _size=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&client_len);
        if(_size<0){
            perror("recvfrom");
        }else if(_size==0){
            printf("client shutdown...\n");
        }else{
            printf("client# %s",buf);
        }
    }
    return 0;
}

客户端程序:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

void usage(char *proc)
{
    printf("%s [ip] [port]\n",proc);
}

int main(int argc,char *argv[])
{
    if(argc!=3){
        usage(argv[0]);
        return 1;
    }   
    
    //创建套接字
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0){
        perror("socket");
        return 2;
    }
    
    int _port=atoi(argv[2]);
    char *_ip=argv[1];

    //remote保存远端服务器的信息
    struct sockaddr_in remote;
    remote.sin_family=AF_INET;
    remote.sin_port=htons(_port);
    remote.sin_addr.s_addr=inet_addr(_ip);
    socklen_t remote_len=sizeof(remote);

    char buf[1024];
    while(1){
        printf("Please Enter:");
        fgets(buf,sizeof(buf),stdin);
        //发送数据
        ssize_t _size=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&remote,remote_len);
        if(_size<0){
            perror("sendto");
        }
    }
    return 0;
}

服务器端运行结果:

运行了3个客户端结果:

时间: 2024-08-04 11:58:16

socket——UDP服务器的相关文章

【windows socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

C#网络编程系列文章(五)之Socket实现异步UDP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现.System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient.TCPListener 和 UDPCl

C#网络编程系列文章(六)之Socket实现同步UDP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现.System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient.TCPListener 和 UDPCl

socket编程之----UDP服务器

与面向连接的协议相比,面向无连接协议极为不同.其中一个重要的不同点就是客户端与服务器之间不必建立连接. 对于UDP套接字编程而言,服务器创建套接字后,调用bind()函数将套接字与准备接收数据的接口绑定在一起.和TCP编程不同的是,应用程序不必调用 listen()和accept()函数等待客户端的连接.而只需要等待接收数据了.开发UDP套接字应用程序,有两个重要的函数sendto()和 recvfrom().服务器采用recvfrom()来接收来自客户端的数据报,并获得客户端的端地址,之后向客

C#的UDP服务器

最新优化版本 /* http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html */ using System; using System.Text; #region 命名空间 using System.Net; using System.Net.Sockets; using System.Threading; using System.Media; #endregion namespace SocketServerCon

windows下UDP服务器和客户端的实现

UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据. 服务器端 1.初始化 WASStartup ( ... ) 2.创建Socket s = socket ( .. ) 3.绑定 bind( .. ) 4.收发数据 recvfrom( .. ) sendto(..) 5.关闭连接,释放资源 closesocket(..) WSACleanup() 客户端 // 无需绑定 1.初始化 WASStartup ( ... ) 2.创建Socket s =

UDP服务器/客户端代码示例

UDP服务器代码: 1 #include <errno.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <iostream> 9 10 usi

netty学习:UDP服务器与Spring整合(2)

上一篇文章中,介绍了netty实现UDP服务器的栗子,本文将会对UDP服务器与spring boot整合起来,并使用RedisTemplate的操作类访问Redis和使用JPA链接MySQL,其中会使用多线程.异步等知识. 本人使用的编辑器是IntelliJ IDEA 2017.1.exe版本(链接:http://pan.baidu.com/s/1pLODHm7 密码:dlx7):建议使用STS或者是idea编辑器来进行spring的学习. 1)项目目录结构 整个项目的目录结构如下: 2)jar

udp 服务器界面监听

今天在做项目的时候,发现不同子网下是不能做UDP通信的,不知道是不是这样呢 遇到一个错误:eclipse遇到报错: The type JPEGImageEncoder is not accessible due to restriction on required library C:\Java\jre1.6.0_07\lib\rt.jar google后发现用以下方式解决: 这个事eclipse的设置问题,它默认把这些受访问限制的API设成了ERROR,你只要把Windows-Preferen