linux select()详解( 二)-- UDP最简实例
来源:互联网 发布:access数据库查询姓名 编辑:程序博客网 时间:2024/05/22 13:55
通过本文你会了解到:
1. UDP server的实例
2. UDP client的实例
3. UDP server和client的运行测试
UDP server实例(server.c)
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <errno.h>//macro#define BUF_SIZE 1024 #define PORT 1025 #undef handle_error#define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while(0)int main(int argc, char *argv[]){ struct sockaddr_in server_addr; fd_set read_fds; socklen_t len; char buf[BUF_SIZE]; int server_fd = -1; int ret; if((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) handle_error("socket"); memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*any ip*/ if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) handle_error("bind"); printf("accepting connections on port %d\n", PORT); while(1) { FD_ZERO(&read_fds); FD_SET(server_fd ,&read_fds); ret = select(server_fd + 1, &read_fds, NULL, NULL, NULL); if(ret == -1 && errno == EINTR) continue; if(ret == -1) handle_error("select"); if(ret == 0) /*timeout, if you set timeout.*/ continue; if(FD_ISSET(server_fd, &read_fds)) { memset(buf, 0, BUF_SIZE); len = sizeof(server_addr); if(recvfrom(server_fd, (void *)buf, BUF_SIZE, 0, (struct sockaddr *)&server_addr, &len) > 0) { printf("Receive packet from %s:%d\nData:%s\n", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port), buf); } else { handle_error("recvfrom"); } } } close(server_fd); return 0;}
UDP client实例(client.c)
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/un.h>#include <string.h>#include <pthread.h>#include <errno.h>//macro#define BUF_SIZE 1024 #define PORT 1025 #define SEND_PACK_CNT 3#define SRV_IP "127.0.0.1" #undef handle_error#define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while(0)int main(int argc, char *argv[]){ struct sockaddr_in server_addr; char buf[BUF_SIZE]; int server_fd = -1; int i; if((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) handle_error("socket"); memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); if (inet_aton(SRV_IP, &server_addr.sin_addr) == 0) handle_error("inet_aton"); for(i = 0; i < SEND_PACK_CNT; i++) { sprintf(buf, "Packet %d", i); sendto(server_fd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); } close(server_fd); return 0;}
运行测试
编译 gcc server.c -o server
gcc client.c -o client
server端运行结果
#./serveraccepting connections on port 1025/*下列内容时运行client后,server端收到的数据包后的打印信息*/Receive packet from 127.0.0.1:34833Data:Packet 0Receive packet from 127.0.0.1:34833Data:Packet 1Receive packet from 127.0.0.1:34833Data:Packet 2
0 0
- linux select()详解( 二)-- UDP最简实例
- linux select()详解( 三)-- TCP最简实例
- linux c编程 UDP实例二
- linux select()详解( 四)-- Unix域字节流最简实例
- Linux select() 详解
- platform按键驱动(二)——编程测试实例以及select()函数详解
- Linux select函数(二)
- Linux select函数(二)
- LInux 下网络编程之一UDP通信实例详解
- TCP/UDP详解二
- c语言udp通信实例(linux)
- c语言udp通信实例(linux)
- Linux select()详解(转载)
- Linux网络编程【二】:UDP socket套接字详解
- Linux--网络编程(二)UDP编程
- UDP并发服务器模型 二:select机制
- linux udp详解总结
- Netty学习之二--Java socket编程(UDP实例)
- PLSQL绿色版设置中文编码
- WebBrowser的Cookie操作之流量刷新机
- 自定义View(单点触控)
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- Java ServerSocket 绑定随机端口
- linux select()详解( 二)-- UDP最简实例
- C++之中this指针与类的六个默认函数小结
- c++实现冒泡排序
- 对象序列化对于一个对象被多个对象共享的处理方法
- 第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析
- laravel5.2.3入门(一)
- Middle-题目83:49. Group Anagrams
- HDU 还是畅通工程
- C#在线预览文档(word,excel,pdf,txt,png)