一种简单的UDP服务器框架
来源:互联网 发布:如何成为淘宝服务商 编辑:程序博客网 时间:2024/06/05 16:49
代码组织:
进入lib,
socket.h
/** @filesocket.h @briefSocket API header file UDP socket utility functions, it provides simple functions that helps to build UDP client/server. @author wangzhicheng */#ifndef SOCKET_H#define SOCKET_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <sys/types.h>#include <resolv.h>#include <fcntl.h>intUDPServerInit(int port, int *serverfd);intUDPClientInit(int *clientfd);intUDPRecv(int sockfd, void *buf, size_t size, char *from_ip, int *port);intUDPSend(int sockfd, const void *buf, size_t size, const char *to_ip, const int *port);int UDPClose(int sockfd);#endif
socket.c
#include "socket.h"/* * @briefinitialize UDP server * @portport number for socket * @serverfdserver socket fd * return server socked fd for success, on error return error code * */intUDPServerInit(int port, int *serverfd) {struct sockaddr_in server;// create socket , same as client*serverfd = socket(AF_INET, SOCK_DGRAM, 0);if(*serverfd < 0) return -1;/// initialize structure destmemset((void*)&server, '\0', sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(port);server.sin_addr.s_addr = INADDR_ANY;// Assign a port number to socketbind(*serverfd, (struct sockaddr*)&server, sizeof(server));return *serverfd;}/* * @briefinitialize UDP client * @clientfdclient socket fd * return client socked fd for success, on error return error code */intUDPClientInit(int *clientfd) {*clientfd = socket(AF_INET, SOCK_DGRAM, 0);return *clientfd;}/* * @briefUDPRecv from UDP socket * @clientfdsocket fd * @buf receving buffer * @sizebuffer size * @from_ipthe client ip address of requested from UDP * return the length of receive data */intUDPRecv(int sockfd, void *buf, size_t size, char *from_ip, int *port) {struct sockaddr_in client;size_t addrlen = 0;int rc;memset(&client, '\0', sizeof(client));addrlen = sizeof(client);rc = recvfrom(sockfd, buf, size, 0, (struct sockaddr *)&client, &addrlen);strcpy(from_ip, (const char *)inet_ntoa(client.sin_addr));*port = htons(client.sin_port);return rc;}/* * @briefUDPSend from UDP socket * @clientfdsocket fd * @buf sending buffer * @sizebuffer size * @to_ipthe ip address of target server * return the length of sending data */intUDPSend(int sockfd, const void *buf, size_t size, const char *to_ip, const int *port) {struct sockaddr_in server;memset(&server, '\0', sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(*port);inet_aton(to_ip, &server.sin_addr);return sendto(sockfd, buf, size, 0, (struct sockaddr *)&server, sizeof(server));}/* * close the socket * */int UDPClose(int sockfd) {return close(sockfd);}
进入server
server.c
/************************************************************************* > File Name: server.c > Author: ma6174 > Mail: ma6174@163.com > Created Time: Sat 04 Oct 2014 09:46:30 PM WST ************************************************************************/#include "socket.h"int UDPPORT = 4001;#define SIZE 256int main() {int serverfd = -1;char buf[SIZE];char from_ip[SIZE];int port, num;if(UDPServerInit(UDPPORT, &serverfd) < 0) {perror("can init UDP server...!\n");exit(EXIT_FAILURE);}while(1) {num = UDPRecv(serverfd, buf, SIZE, from_ip, &port);if(num < 0) {perror("receving error...!\n");exit(EXIT_FAILURE);}buf[num] = '\0';printf("You got a message %s from client ..\n Its ip is %s, port is %d\n", buf, from_ip, port);if(!strcmp(buf, "bye")) {break;}//sleep(1);}UDPClose(serverfd);return 0;}
Makefile
CC=gccLIBRARY=../libCFLAGS=-I$(LIBRARY)CXXFLAGS=OBJS1=server.o socket.o all:serverserver: $(OBJS1)$(CC) -o $@ $(OBJS1) socket.o: $(LIBRARY)/socket.c$(CC) -c $(LIBRARY)/socket.cclean:rm *.o server > /dev/null 2>&1
进入client
client.c
/************************************************************************* > File Name: client.c > Author: ma6174 > Mail: ma6174@163.com > Created Time: Sat 04 Oct 2014 09:46:30 PM WST ************************************************************************/#include "socket.h"#define SIZE 256int UDPPORT = 4001;const char *serveraddr = "127.0.0.1";int main() {int clientfd = -1;char buf[SIZE];size_t num;UDPClientInit(&clientfd);if(clientfd < 0) {perror("UDP client init failed...!\n");exit(EXIT_FAILURE);}while(1) {puts("sending message...:");scanf("%s", buf);UDPSend(clientfd, buf, strlen(buf), serveraddr, &UDPPORT);//sleep(1);}return 0;}Makefile
CC=gccLIBRARY=../libCFLAGS=-I$(LIBRARY)CXXFLAGS=OBJS1=client.o socket.o all:clientclient: $(OBJS1)$(CC) -o $@ $(OBJS1) socket.o: $(LIBRARY)/socket.c$(CC) -c $(LIBRARY)/socket.cclean:rm *.o client > /dev/null 2>&1
测试:
0 0
- 一种简单的UDP服务器框架
- 使用Reactor框架的简单udp服务器
- 一种简单的RPC框架
- 简单的UDP循环服务器:时间服务器
- 一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密
- 简单的服务器框架
- 一种不需要握手服务器穿透NAT的UDP通讯方法
- 一种高性能的服务器处理框架
- udp服务器_简单的控制台程序
- 简单的python UDP服务器客户端连接
- 单用户UDP服务器的简单实现
- UDP服务器、客户端的简单实现
- 一种简单的UDP网络重传机制
- KSP:一种简单的服务器页面脚本
- UDP简单服务器
- epoll学习:思考一种高性能的服务器处理框架
- epoll学习:思考一种高性能的服务器处理框架
- epoll学习:思考一种高性能的服务器处理框架
- 关于android开发中涉及到的java知识:面向对象(三)
- Currency Exchange(最短路_Beelman_Ford)
- ping程序源码
- 中国的悲哀:电视剧原来是这样审查的!瞬间跪了!
- fgbvwef
- 一种简单的UDP服务器框架
- 聚石塔应用构建
- 安装了IIS之后在管理工具里找不到”Internet信息服务"的解决办法
- strlen()实现
- 分层自动化测试
- 进程的独立的用户空间和共享的内核空间
- 刻录原版系统光盘(用软碟通)
- 第八周项目2.2 多分段函数求值(switch语句)
- xcefvwqf