非阻塞UDP示例

UDP编程中我们实现一个简单的C/S机制,并且实现广播和组播

2.1.1 简单的通信例子 服务端,初始化过程,设置了地址复用(可以创建多个服务器实例)和接收发送超时。

int udp_server_init(char *netAddr, int port)
{
    iSocketFd = socket(AF_INET, SOCK_DGRAM, 0);//create a ucp socket file
    if(-1 == iSocketFd){
        printf("create socket fd err:%s\n", strerror(errno));
        return -1;
    }




    int on = 1;
    struct timeval timeout={2,5};//timeout
    if((-1 == setsockopt(iSocketFd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))) || //allow up serval server program
       (-1 == setsockopt(iSocketFd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout))) ||
       (-1 == setsockopt(iSocketFd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout)))){
        printf("setsockopt err:%s\n", strerror(errno));
        return -1;
    }




    //create socket addr struct
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family  = AF_INET; 
    server_addr.sin_port    = port;
    if(NULL == netAddr){
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//accept all interface of host
    } else {
        server_addr.sin_addr.s_addr = inet_addr(netAddr); //accept one interface of host
    }




    if(-1 == bind(iSocketFd, (struct sockaddr*)&server_addr, sizeof(server_addr))){
        printf("bind error:%s\n", strerror(errno));
        return -1;
    }




    return 0;
}

INADDR_ANY表示可以接收本机所有网络接口的数据,以及内网所有的数据,如果设成某个IP,那么表示只能接收这个IP接口发来的数据。 接收函数:(需要先建立一个新的地址变量来存放客户端地址)

客户端程序:

UDP的断开检测没有做,recvfrom的说明是返回0断开,但是实际上没有用,UDP似乎也不用关心它的状态。 此外,程序中使用了两种Socket的结构体,一种是sockaddr_in,一种是sockaddr,这两种结构体在发送和接收时互相转换,那么为什么会有这两种结构体呢?前者的定义如下:

后者定义:

sockaddr主要是用于各种Socket函数使用,但是在用户定义时一般不去用它,用前者会更方便。至于为什么会有两种方式,在网上找到一种解答,不知道对不对,或许这个也是因为一些历史原因导致的也说不定:

最后更新于

这有帮助吗?