非阻塞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函数使用,但是在用户定义时一般不去用它,用前者会更方便。至于为什么会有两种方式,在网上找到一种解答,不知道对不对,或许这个也是因为一些历史原因导致的也说不定:
最后更新于
这有帮助吗?