#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 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;
}
} int main(int argc, char * argv[])
{
char * server;
char * serverPort;
char * echoString;
size_t echoStringLength; struct addrinfo addrCriteria;
struct addrinfo *serverAddr;
int socketHandle;
int returnValue;
ssize_t receivedBytesCount;
ssize_t sendBytesCount;
struct sockaddr_storage responseAddr;
socklen_t responseAddrLen = sizeof(struct sockaddr);
char buffer[BUFFER_LENGTH + 1]; int broadcastPermission = 1; if(argc < 3 || argc > 4)
{
ExitWithMessage(1, "Parameters: <Server_IPv4> <Server_Port> <Message>");
} server = argv[1];
serverPort = argv[2];
echoString = argv[3];
echoStringLength = strlen(echoString); if(echoStringLength >= BUFFER_LENGTH)
{
ExitWithMessage(2, "Message is too long.");
} 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(server, serverPort, &addrCriteria, &serverAddr);
if(returnValue != 0)
{
fprintf(stderr, "getaddrinfo() failed.\n");
ExitWithMessage(returnValue, gai_strerror(returnValue));
} // Create a datagram/UDP socket
socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol);
if(socketHandle < 0)
{
fprintf(stderr, "socket() failed.\n");
ExitWithMessage(socketHandle, gai_strerror(socketHandle));
} // Set socket to be allowed broadcast returnValue = setsockopt(
socketHandle, SOL_SOCKET,
SO_BROADCAST,
(void *) &broadcastPermission,
sizeof(broadcastPermission)); if(returnValue != 0)
{
fprintf(stderr, "setsockopt() failed.\n");
ExitWithMessage(returnValue, gai_strerror(returnValue));
} sendBytesCount = sendto(socketHandle, echoString, echoStringLength, 0, serverAddr->ai_addr, serverAddr->ai_addrlen);
if(sendBytesCount < 0)
{
fprintf(stderr, "sendto() failed.\n");
ExitWithMessage(sendBytesCount, gai_strerror(sendBytesCount));
} // Receive a response receivedBytesCount = recvfrom(
socketHandle,
buffer,
BUFFER_LENGTH,
0,
(struct sockaddr *)&responseAddr,
&responseAddrLen); if(receivedBytesCount < 0)
{
fprintf(stderr, "recvfrom() failed.\n");
ExitWithMessage(receivedBytesCount, gai_strerror(receivedBytesCount));
} fputs("Server address: ", stdout);
PrintSocketAddress((struct sockaddr *)&responseAddr, stdout); buffer[receivedBytesCount] = '\0';
printf("\nResponse: %s\n", buffer); freeaddrinfo(serverAddr); return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

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

  1. Socket tips: UDP Echo service - Server 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. Linux 网络编程: echo Service

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

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

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

  5. socket和udp简介

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

  6. OData Client Code Generator

    转发. [Tutorial & Sample] How to use OData Client Code Generator to generate client-side proxy cla ...

  7. OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

    一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...

  8. 在socket的server端处理client端发来的数据

    一.楔子 最近做了一个需求遇到一个坑,归结成一个小问题,其实就是在socket的server端处理client端发来的数据的问题,现将这个问题总结一下,本文将数据在server端以字典的形式存储. 另 ...

  9. [转]OData的初步认识 OData v4 Client Code Generator

    本文转自:http://www.cnblogs.com/1zhk/p/5356053.html What – OData是什么? OData - Open Data Protocol,是一个设计和使用 ...

随机推荐

  1. [欧拉] poj 2513 Colored Sticks

    主题链接: http://poj.org/problem? id=2513 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Tota ...

  2. mysql5.1,5.5,5.6做partition时支持的函数

    mysql5.1支持的partition函数(http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.htm ...

  3. 大规模集群管理工具Borg

    Google的大规模集群管理工具Borg 概述 Google的Borg系统是一个集群管理工具,在它上面运行着成千上万的job,这些job来自许许多多不同的应用,并且跨越多个集群,而每个集群又由大量的机 ...

  4. 阐述php(四) 流量控制

    一个.选择结构 1. 单路分支 <? php if(条件){ 运行一条语句; } ?> 2. 双路分支 <?php if(条件) 运行一条语句; }else 运行一条语句; } ?& ...

  5. 动态加载资源文件(ResourceDictionary)

    原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...

  6. windows phone (15) UI变换上

    原文:windows phone (15) UI变换上 在wp中只要是继承自UIElement 的任何对象都可以应用变换,当然包含Textblock,Rectangle等所有的元素,下面我们使用Tex ...

  7. sublime text 2安装及使用

    1.首先下载Sublime Text:http://www.sublimetext.com/ 2.基本设置.參考此文:http://blog.jobbole.com/40660/ { "au ...

  8. HDU1176_免费馅饼【号码塔】

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. WPF MediaElement播放器2

    在此问个问题,MediaElement播放本地和http上的视频没问题,但是ftp的怎么在本例中播放不了 若高手了解,请不吝赐教 using System; using System.Collecti ...

  10. 观察者模式(Observer Patterns)

    今天学习了观察者模式,做个总结,方便以后回想. 首先是定义:观察者模式就是定义对象之间一对多的依赖关系,当一个对象状态发生改变时,全部依赖他的对象都收到推送消息并自己主动更新做出改变. 我的理解:生活 ...