嵌入式 Linux网络编程(三)——UDP编程模型
2016-07-10 21:49
633 查看
嵌入式 Linux网络编程(三)——UDP编程模型
UDP编程模型:UDP循环服务器模型为:
socket(...); bind(...); while(1) { recvfrom(...); process(...); sendto(...); }server.c代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建udp套接字 if(sockfd < 0) { fprintf(stderr, "socket function failed.\n"); exit(-1); } struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET;// IPv4 server_addr.sin_port = htons(PORT);// 端口 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip // 绑定 int err; err = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(err != 0) { fprintf(stderr, "bind function failed.\n"); close(sockfd); exit(-1); } fprintf(stdout, "server runiing on %d\n", PORT); char recvbuf[BUFFER_SIZE]; struct sockaddr_in client_addr; while(1) { int recvlen; bzero(&recvbuf, sizeof(recvbuf)); socklen_t len = sizeof(client_addr); bzero(&client_addr, sizeof(client_addr)); if(strcmp(recvbuf,"exit\n")==0) break; if(strcmp(recvbuf,"q\n")==0) break; if(strcmp(recvbuf,"quit\n")==0) break; // 接收客户端数据 recvlen = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&client_addr, &len); fprintf(stdout, "have a new client :%s, port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 客户端的ip printf("message: %s\n", recvbuf); sendto(sockfd, recvbuf, recvlen, 0, (struct sockaddr*)&client_addr, len); } close(sockfd); return 0; }
client.c代码:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int clientsockfd = socket(AF_INET, SOCK_DGRAM, 0); ///定义sockaddr_in struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr("192.168.0.200"); ///服务器ip ///连接服务器,成功返回0,错误返回-1 if (connect(clientsockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { fprintf(stderr, "connect function failed.\n"); exit(-1); } char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; bzero(sendbuf, sizeof(sendbuf)); bzero(recvbuf, sizeof(recvbuf)); while (1) { fgets(sendbuf, sizeof(sendbuf), stdin); if(strcmp(sendbuf,"exit\n")==0) break; if(strcmp(sendbuf,"q\n")==0) break; if(strcmp(sendbuf,"quit\n")==0) break; send(clientsockfd, sendbuf, strlen(sendbuf),0); ///发送 recv(clientsockfd, recvbuf, sizeof(recvbuf),0); ///接收 fprintf(stdout, "%s\n", recvbuf); bzero(sendbuf, sizeof(sendbuf)); bzero(recvbuf, sizeof(recvbuf)); } close(clientsockfd); return 0; }
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍