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

与面向连接的协议相比,面向无连接协议极为不同。其中一个重要的不同点就是客户端与服务器之间不必建立连接。

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

下面是一个简单的UDP服务器的实现:

//udp_server.c

#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;
}

//udp_client.c

#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];

    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;    
}

运行结果:

时间: 2025-01-17 07:57:20

socket编程之----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编程之----TCP服务器

一.socket编程socket这个词可以表很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯标识络通讯中的个进程,"IP地址+端口号"就称为socket.在TCP协议中,建连接的两个进程各有个socket来标识,那么这两个socket组成 的socket pair就唯标识个连接. socket本有"插座"的意思,因此来描述络连接的 对关系.TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应层编程接称为s

Windows Socket 编程_单个服务器对多个客户端简单通讯

单个服务器对多个客户端程序: 一.简要说明 二.查看效果 三.编写思路 四.程序源代码 五.存在问题 一.简要说明: 程序名为:TcpSocketOneServerToMulClient 程序功能:实现单个服务器对多个客户端通讯功能的小程序. PS: 这是继上次简单的 Tcp Windows Socket 编程后的再一程序,程序实现依然不是很严谨,还待完善~ 二.查看效果: 三.编写思路: 由上一次的程序思路来看,如果想实现单个服务器对多个客户端程序的通讯的话,这次程序编写尝试从多线程的角度来考

java Socket编程-基于UDP

package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * * @author wzy * 服务器端,实现基于UDP的用户登陆 */ public class UDPserver { public static void main(String[] args) { try{ //1.创建服务器端Datagram

Socket编程(TCP/UDP) - 初学(C语言)

Socket socket函数 TCP代码实现 TCP Server TCP Client UDP代码实现 UDP Server UDP Client Socket 先介绍一下socket的启动过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态. (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器

C# socket编程 使用udp实现单对单的连接对话

ipLocalPoint = new IPEndPoint(IPAddress.Parse("192.168.31.122"), 5000); //定义网络类型,数据连接类型和网络协议UDP mySocket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //绑定网络地址 mySocket.Bind(ipLocalPoint); //得到客户机IP IPAddress ip

socket本地模拟UDP 服务器+客户端(三)

UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不能到达就不知道了. 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议. 服务端程序: # 1 创建套接字,并绑定到当地地址 socket,bing # 2 直接接收数据从buffer.Recvfrom(),这个函数接受到数据,和#s

Java Socket编程,读服务器几个字符,再写入本地显示。

Server端程序 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { private ServerSocket ss; private Socket soc