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


服务器端运行结果:

socket――UDP服务器_第1张图片

运行了3个客户端结果:

socket――UDP服务器_第2张图片


你可能感兴趣的:(socket,服务器,UDP)