一种简单的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
原创粉丝点击