1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. #include <time.h>
  8.  
  9. #define BUFFER_LENGTH 1024
  10.  
  11. void ReverseMessage(char buffer[], ssize_t receivedBytesCount);
  12.  
  13. void ExitWithMessage(const int errorCode, const char * errorMessage)
  14. {
  15. fprintf(stderr, "\n\nError Msg : %s\n", errorMessage);
  16. fprintf(stderr, "Error Code : 0x%X\n", errorCode);
  17. fprintf(stderr, "Location : %s: %d\n\n", __FILE__, __LINE__);
  18.  
  19. exit(errorCode);
  20. }
  21.  
  22. void PrintIPv4(unsigned long ipvalue, FILE * stream)
  23. {
  24. uint8_t a;
  25. uint8_t b;
  26. uint8_t c;
  27. uint8_t d;
  28.  
  29. a = ipvalue >> 24;
  30.  
  31. ipvalue -= a * 0x01000000;
  32. b = ipvalue >> 16;
  33.  
  34. ipvalue -= b * 0x00010000;
  35. c = ipvalue >> 8;
  36.  
  37. ipvalue -= c * 0100000100;
  38. d = ipvalue;
  39.  
  40. fprintf(stream, "%d.%d.%d.%d", d, c, b, a);
  41. }
  42.  
  43. void PrintSocketAddress(const struct sockaddr * address, FILE * stream)
  44. {
  45. struct in_addr ip4addr;
  46. in_port_t port;
  47.  
  48. struct sockaddr_in * ipv4Address;
  49.  
  50. if(address == NULL || stream == NULL)
  51. {
  52. return;
  53. }
  54.  
  55. //printf("sa_family: %d\n", address->sa_family);
  56.  
  57. switch(address->sa_family)
  58. {
  59. case AF_INET:
  60.  
  61. fputs("[IPv4] ", stream);
  62.  
  63. ipv4Address = (struct sockaddr_in *)address;
  64. ip4addr = ipv4Address->sin_addr;
  65.  
  66. port = ntohs(ipv4Address->sin_port);
  67.  
  68. //fprintf(stream, "ip4addr.s_addr: %X\n", ip4addr.s_addr);
  69. PrintIPv4(ip4addr.s_addr, stream);
  70. fprintf(stream, " : %d", port);
  71.  
  72. break;
  73. case AF_INET6:
  74.  
  75. fputs("[IPv6] ", stream);
  76.  
  77. break;
  78. default:
  79. fputs("[unknown type]", stream);
  80. return;
  81. }
  82. }
  83.  
  84. void PrintTime(FILE * stream)
  85. {
  86. time_t currentTime;
  87. struct tm * local_time;
  88. struct timeval tv;
  89.  
  90. currentTime = time(0);
  91. local_time = localtimetTime);
  92. gettimeofday(&tv);
  93.  
  94. fprintf(stream, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
  95. local_time->tm_year + 1900,
  96. local_time->tm_mon + 1,
  97. local_time->tm_mday,
  98. local_time->tm_hour,
  99. local_time->tm_min,
  100. local_time->tm_sec,
  101. tv.tv_usec / 1000);
  102.  
  103. }
  104.  
  105. int main(int argc, char * argv[])
  106. {
  107. char * serverPortString;
  108. struct addrinfo addrCriteria;
  109. struct addrinfo *serverAddr;
  110. int socketHandle;
  111. int returnValue;
  112.  
  113. struct sockaddr_storage clientAddr;
  114. socklen_t clientAddrLen = sizeof(struct sockaddr);
  115. char buffer[BUFFER_LENGTH];
  116. ssize_t receivedBytesCount;
  117. ssize_t sendBytesCount;
  118.  
  119. if(argc != 2)
  120. {
  121. //ExitWithMessage(0xF001, "Need parameter: <Server_Port>");
  122. serverPortString = "2001";
  123. }
  124. else
  125. {
  126. // First argument: local port
  127. serverPortString = argv[1];
  128. }
  129.  
  130. memset(&addrCriteria, 0, sizeof(struct addrinfo));
  131.  
  132. addrCriteria.ai_family = AF_UNSPEC; // Any address family
  133. addrCriteria.ai_flags = AI_PASSIVE; // Accept on any address/port
  134. addrCriteria.ai_socktype = SOCK_DGRAM; // only datagram socket
  135. addrCriteria.ai_protocol = IPPROTO_UDP; // only UDP socket
  136.  
  137. returnValue = getaddrinfo(NULL, serverPortString, &addrCriteria, &serverAddr);
  138. if(returnValue != 0)
  139. {
  140. fprintf(stderr, "getaddrinfo() failed.\n");
  141. ExitWithMessage(returnValue, gai_strerror(returnValue));
  142. }
  143.  
  144. // Create socket for incomming connections
  145. socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol);
  146. if(socketHandle < 0)
  147. {
  148. fprintf(stderr, "socket() failed.\n");
  149. ExitWithMessage(socketHandle, gai_strerror(socketHandle));
  150. }
  151.  
  152. // Bind to local address
  153. returnValue = bind(socketHandle, serverAddr->ai_addr, serverAddr->ai_addrlen);
  154. if(returnValue < 0)
  155. {
  156. fprintf(stderr, "bind() failed.\n");
  157. ExitWithMessage(returnValue, gai_strerror(returnValue));
  158. }
  159.  
  160. // Free address list allocated by getaddrinfo
  161. freeaddrinfo(serverAddr);
  162.  
  163. printf("Starting the UDP Server ...\n");
  164. printf("Listinning at port %s\n\n", serverPortString);
  165.  
  166. while(1)
  167. {
  168. receivedBytesCount = recvfrom(
  169. socketHandle,
  170. buffer,
  171. BUFFER_LENGTH,
  172. 0,
  173. (struct sockaddr *)&clientAddr,
  174. &clientAddrLen);
  175.  
  176. // printf("Received %d bytes.\n", receivedBytesCount);
  177.  
  178. if(receivedBytesCount < 0)
  179. {
  180. fprintf(stderr, "recvfrom() failed.\n");
  181. ExitWithMessage(receivedBytesCount, gai_strerror(receivedBytesCount));
  182. }
  183.  
  184. fputs("Handling client ", stdout);
  185. PrintSocketAddress((struct sockaddr *)&clientAddr, stdout);
  186.  
  187. fputs(" at ", stdout);
  188. PrintTime(stdout);
  189.  
  190. fputc('\n', stdout);
  191.  
  192. buffer[receivedBytesCount] = '\0';
  193.  
  194. fputs("Message: ", stdout);
  195. fputs(buffer, stdout);
  196. fputs("\n\n", stdout);
  197.  
  198. ReverseMessage(buffer, receivedBytesCount);
  199. sendBytesCount = sendto(socketHandle, buffer, receivedBytesCount, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));
  200. if(sendBytesCount < 0)
  201. {
  202. fprintf(stderr, "sendto() failed.\n");
  203. ExitWithMessage(sendBytesCount, gai_strerror(sendBytesCount));
  204. }
  205. }
  206.  
  207. return 0;
  208. }
  209.  
  210. void ReverseMessage(char buffer[], ssize_t receivedBytesCount)
  211. {
  212. ssize_t i;
  213. ssize_t j;
  214. char temp;
  215.  
  216. for(i = 0; i < receivedBytesCount / 2; i++)
  217. {
  218. j = receivedBytesCount - 1 - i;
  219.  
  220. temp = buffer[i];
  221. buffer[i] = buffer[j];
  222. buffer[j] = temp;
  223. }
  224. }

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. phpmyadmin导出数据库为什么是php文件

    你的迅雷在作怪,把它卸载了,或者在迅雷的高级设置中,关闭监听浏览器,就不会触发迅雷下载,就没问题了.或者360浏览器的话,把急速模式改为兼容模式

  2. iOS中解析 XML / JSON

    JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...

  3. UIWebView禁止点击后跳转

    #pragma mark 禁止webview中的链接点击 - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRe ...

  4. Flume 1.4.0 User Guide

    Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregatin ...

  5. 逆波兰表达式 java

    描述  逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...

  6. 画板社交工具开发分享——HTML5 canvas控件、PHP、社交分享学习(一)

    不谈国内社交网站(人人.微博等)目前的盈利状况如何,facebook.twitter都已经取得了很大的成功.这一定程度上都得益于人们对社交的喜爱和投入. 目前的情况来看,也有很多人已经对直接的文字分享 ...

  7. 1104解决ecos挂件中数组传递的相关问题。

    1.挂件综述: 挂件组成:_config.html   后台配置,即点添加时的弹出框. default.html  前台显示,即在前台显示出来的页面. widget.php   设置挂件的基本信息.. ...

  8. 内联汇编和JMP到内联函数注意事项

    对于jmp类型的hook, 如果自己的过程没有使用_declspec(naked),那么系统会自动给添加一些额外的代码,控制堆栈平衡,但是这些额外的代码会破坏被hook函数的堆栈. 对于call类型的 ...

  9. 高性能Socket组件和RPC,让你像写本地代码一样开发网络应用和分布式程序

    最近想试试C#能不能写出高性能的分布式组件,于是写了一个双工RPC,也当练手,下面是单连接的测试结果,非常给力.机器配置:U:E1230-v2,内存:ddr3-8G 1.递归调用    过程:Clie ...

  10. JSP标准库标签 ———C标签

    一.C标签    一] <c:out value="..." default="..." escapeXml="true">   ...