首页 > 代码库 > 一种简单的UDP服务器框架

一种简单的UDP服务器框架

代码组织:


进入lib,


socket.h

/**
  @file		socket.h
  @brief	Socket 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>

int	UDPServerInit(int port, int *serverfd);
int	UDPClientInit(int *clientfd);
int	UDPRecv(int sockfd, void *buf, size_t size, char *from_ip, int *port);
int	UDPSend(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"
/*
 * @brief		initialize UDP server
 * @port		port number for socket
 * @serverfd	server socket fd
 * return server socked fd for success, on error return error code
 * */
int	UDPServerInit(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 dest
	memset((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 socket
	bind(*serverfd, (struct sockaddr*)&server, sizeof(server));

	return *serverfd;
}
/*
 * @brief	initialize UDP client
 * @clientfd	client socket fd
 * return client socked fd for success, on error return error code
 */
int	UDPClientInit(int *clientfd) {
	*clientfd = socket(AF_INET, SOCK_DGRAM, 0);

	return *clientfd;
}
/*
 * @brief		UDPRecv from UDP socket
 * @clientfd	socket fd
 * @buf	     	receving buffer
 * @size		buffer size
 * @from_ip		the client ip address of requested from UDP
 * return	    the length of receive data
 */
int	UDPRecv(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;
	
}
/*
 * @brief		UDPSend from UDP socket
 * @clientfd	socket fd
 * @buf	     	sending buffer
 * @size		buffer size
 * @to_ip		the ip address of target server
 * return	    the length of sending data
 */
int	UDPSend(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 256

int 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=gcc
LIBRARY=../lib
CFLAGS=-I$(LIBRARY)
CXXFLAGS=
OBJS1=server.o  socket.o 

all:	server


server: $(OBJS1)
	$(CC) -o   $@ $(OBJS1)  

socket.o: $(LIBRARY)/socket.c
	$(CC) -c $(LIBRARY)/socket.c

clean:
	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 256
int 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=gcc
LIBRARY=../lib
CFLAGS=-I$(LIBRARY)
CXXFLAGS=
OBJS1=client.o  socket.o 

all:	client


client: $(OBJS1)
	$(CC) -o   $@ $(OBJS1) 

socket.o: $(LIBRARY)/socket.c
	$(CC) -c $(LIBRARY)/socket.c

clean:
	rm *.o client  > /dev/null 2>&1

测试:



一种简单的UDP服务器框架