#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h> #define BUFFER_LENGTH 1024 void ReverseMessage(char buffer[], ssize_t receivedBytesCount); void ExitWithMessage(const int errorCode, const char * errorMessage)
{
fprintf(stderr, "\n\nError Msg : %s\n", errorMessage);
fprintf(stderr, "Error Code : 0x%X\n", errorCode);
fprintf(stderr, "Location : %s: %d\n\n", __FILE__, __LINE__); exit(errorCode);
} void PrintIPv4(unsigned long ipvalue, FILE * stream)
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d; a = ipvalue >> 24; ipvalue -= a * 0x01000000;
b = ipvalue >> 16; ipvalue -= b * 0x00010000;
c = ipvalue >> 8; ipvalue -= c * 0100000100;
d = ipvalue; fprintf(stream, "%d.%d.%d.%d", d, c, b, a);
} void PrintSocketAddress(const struct sockaddr * address, FILE * stream)
{
struct in_addr ip4addr;
in_port_t port; struct sockaddr_in * ipv4Address; if(address == NULL || stream == NULL)
{
return;
} //printf("sa_family: %d\n", address->sa_family); switch(address->sa_family)
{
case AF_INET: fputs("[IPv4] ", stream); ipv4Address = (struct sockaddr_in *)address;
ip4addr = ipv4Address->sin_addr; port = ntohs(ipv4Address->sin_port); //fprintf(stream, "ip4addr.s_addr: %X\n", ip4addr.s_addr);
PrintIPv4(ip4addr.s_addr, stream);
fprintf(stream, " : %d", port); break;
case AF_INET6: fputs("[IPv6] ", stream); break;
default:
fputs("[unknown type]", stream);
return;
}
} void PrintTime(FILE * stream)
{
time_t currentTime;
struct tm * local_time;
struct timeval tv; currentTime = time(0);
local_time = localtime(¤tTime);
gettimeofday(&tv); fprintf(stream, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
local_time->tm_year + 1900,
local_time->tm_mon + 1,
local_time->tm_mday,
local_time->tm_hour,
local_time->tm_min,
local_time->tm_sec,
tv.tv_usec / 1000); } int main(int argc, char * argv[])
{
char * serverPortString;
struct addrinfo addrCriteria;
struct addrinfo *serverAddr;
int socketHandle;
int returnValue; struct sockaddr_storage clientAddr;
socklen_t clientAddrLen = sizeof(struct sockaddr);
char buffer[BUFFER_LENGTH];
ssize_t receivedBytesCount;
ssize_t sendBytesCount; if(argc != 2)
{
//ExitWithMessage(0xF001, "Need parameter: <Server_Port>");
serverPortString = "2001";
}
else
{
// First argument: local port
serverPortString = argv[1];
} memset(&addrCriteria, 0, sizeof(struct addrinfo)); addrCriteria.ai_family = AF_UNSPEC; // Any address family
addrCriteria.ai_flags = AI_PASSIVE; // Accept on any address/port
addrCriteria.ai_socktype = SOCK_DGRAM; // only datagram socket
addrCriteria.ai_protocol = IPPROTO_UDP; // only UDP socket returnValue = getaddrinfo(NULL, serverPortString, &addrCriteria, &serverAddr);
if(returnValue != 0)
{
fprintf(stderr, "getaddrinfo() failed.\n");
ExitWithMessage(returnValue, gai_strerror(returnValue));
} // Create socket for incomming connections
socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol);
if(socketHandle < 0)
{
fprintf(stderr, "socket() failed.\n");
ExitWithMessage(socketHandle, gai_strerror(socketHandle));
} // Bind to local address
returnValue = bind(socketHandle, serverAddr->ai_addr, serverAddr->ai_addrlen);
if(returnValue < 0)
{
fprintf(stderr, "bind() failed.\n");
ExitWithMessage(returnValue, gai_strerror(returnValue));
} // Free address list allocated by getaddrinfo
freeaddrinfo(serverAddr); printf("Starting the UDP Server ...\n");
printf("Listinning at port %s\n\n", serverPortString); while(1)
{
receivedBytesCount = recvfrom(
socketHandle,
buffer,
BUFFER_LENGTH,
0,
(struct sockaddr *)&clientAddr,
&clientAddrLen); // printf("Received %d bytes.\n", receivedBytesCount); if(receivedBytesCount < 0)
{
fprintf(stderr, "recvfrom() failed.\n");
ExitWithMessage(receivedBytesCount, gai_strerror(receivedBytesCount));
} fputs("Handling client ", stdout);
PrintSocketAddress((struct sockaddr *)&clientAddr, stdout); fputs(" at ", stdout);
PrintTime(stdout); fputc('\n', stdout); buffer[receivedBytesCount] = '\0'; fputs("Message: ", stdout);
fputs(buffer, stdout);
fputs("\n\n", stdout); ReverseMessage(buffer, receivedBytesCount);
sendBytesCount = sendto(socketHandle, buffer, receivedBytesCount, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));
if(sendBytesCount < 0)
{
fprintf(stderr, "sendto() failed.\n");
ExitWithMessage(sendBytesCount, gai_strerror(sendBytesCount));
}
} return 0;
} void ReverseMessage(char buffer[], ssize_t receivedBytesCount)
{
ssize_t i;
ssize_t j;
char temp; for(i = 0; i < receivedBytesCount / 2; i++)
{
j = receivedBytesCount - 1 - i; temp = buffer[i];
buffer[i] = buffer[j];
buffer[j] = temp;
}
}

Socket tips: UDP Echo service - Server code的更多相关文章

  1. Socket tips: UDP Echo service - Client code

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...

  2. Socket tips: 同意socket发送UDP Broadcast

    假设创建一个UDP Socket: socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, server ...

  3. 网络编程-UDP echo server

    1. UDP简介 UDP 和TCP 的区别包括 1. 面向字节流和面向报文 2. TCP必须要建立连接后才能进行数据交换,但是UDP则并没有连接的建立和释放过程.面向字节流说明,tcp报文段(segm ...

  4. Linux 网络编程: echo Service

    前言 大病初愈,感谢某人的陪伴,感谢王乐庆同学和赵攀同学的细心照顾.原以为过了第八周就不忙了,却没想到还有明天的党章考试.还是写代码比背党章有意思~趁着服务器还没过期,赶紧把 echo 完成了.关于错 ...

  5. 网络Socket编程UDP协议例子

    服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...

  6. socket和udp简介

    socket简介 1.本地的进程间通信(IPC)有很多种方式,例如 队列 同步(互斥锁.条件变量等) 以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了 网络中进程之间如何通信? 2. ...

  7. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

  8. 网络编程之socket(TCP,UDP)

    socket层 tcp协议和udp协议 1)Socket服务器编程 主要包括下面的几步: 1.打开socket 2.绑定到一个地址和端口 3.侦听进来的连接 4.接受连接 5.读写数据 (2)Sock ...

  9. python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

随机推荐

  1. NYOJ737

    题意:给n堆石子,按照顺序排列,只能相邻两堆石子合并,求最后合并为一堆时所花费的最小代价,石子合并代价为两堆石子之和. 输入: n(石子堆数) Xi(每堆石子个数) 输出: T(最小代价) 思路:经典 ...

  2. .net中Web.config文件的基本原理及相关设置

    11.7  使用web.config配置文件 Web配置文件web.config是Web 应用程序的数据设定文件,它是一份 XML 文件,内含 Web 应用程序相关设定的 XML 标记,可以用来简化  ...

  3. Android WebView支持WebGL

    Android从5.0开始默认支持WebGL,我在实际开发中遇到了一些5.0设备不支持的情况,原来Chromium对运行GPUs不稳定的或者有兼容性问题的设备会禁用WebGL.在Android平台可以 ...

  4. Php OpenID

    也许大家都有这样的经历与烦恼:当你为了使用某个网站的服务时(若你还没在该网站上注册过),你不得不先注册一个帐号.当你在一堆的网站上注册帐号后,你必需面临管理这些帐号的烦恼.也许你会这样考虑,不同网站注 ...

  5. java事件处理2

    Document事件 这个事件有点特别,需要用getDocument()返回到自己所维护的文档,然后就可以添加监视器 (textArea1.getDocument).addDocumentListen ...

  6. 控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了

    控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了,就是按钮上的或其他控件上的图片哪里去了?

  7. 【转载】Express、Koa、Hapi框架对比

    中文翻译:http://ourjs.com/detail/5490db1c8a34fa320400000e 英文原文:https://www.airpair.com/node.js/posts/nod ...

  8. Sql Server索引(转载)

    官方说法: 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序, ...

  9. validate插件深入篇

    1.使用valid()来验证表单是否填写正确: <form id="mainform"> <button id="check">< ...

  10. java J2EE学习入门

    首先学习JAVA基础编程,大学教材就是最简单的了!象写写Helloworld啊 输出水仙花数啊 玩些简单的,慢慢在研究研究流啊,都可以了.然后学习简单的JSP,这个时候多上网上DOWN一些原码.多看看 ...