服务器程序:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024
#define SERV_PORT 8000
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen);
int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
close(sockfd);
return 0;
}
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
char *hostname = "app-server";
for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
//mesg[n] ='/0';
printf("OK,i receave a data %s \n",mesg);
snprintf(mesg,sizeof(mesg)," Authentication Required: %s\r\n"
"Result: 1\r\n"
"Call-ID: %s\r\n\r\n",hostname,hostname,hostname);
/* sent data back to client */
sleep(2);
n = sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}
客户端程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <time.h>
#define SERVPORT 8000
#define MAXDATASIZE 1024
#define AST_MAX_MANHEADERS 10
typedef struct _input_data {
/*! Buffer */
char inbuf[1024];
int inlen;
const char *headers[AST_MAX_MANHEADERS];
}input_data;
#define input_data_len sizeof(input_data)
static char *parse_result(input_data *s,char *var);
int main()
{
char sentbuf[1024];
char recvBuffer[1024];
char outbuffer[1024];
int serlen;
struct hostent *host;
char hostname[30] = {0};
char tmp[55];
time_t start;
memcpy(hostname,"app-server",sizeof(hostname));
snprintf(sentbuf,sizeof(sentbuf)," Authentication Required: %s\r\n"
"Agent-Number:%s\r\n"
"Result: 2\r\n"
"Call-ID: %s\r\n\r\n",hostname,hostname,hostname);
//snprintf(sentbuf,sizeof(sentbuf),"I alaway look for you ld%",time(&start));
printf("sentbuf is %s %s time %ld\n",sentbuf,hostname,time(&start));
int sock;
int on;
struct sockaddr_in servaddr; //sendto中使用的对方地址
struct sockaddr_in fromAddr; //在recvfrom中使用的对方主机地址
unsigned int fromLen;
host = gethostbyname(hostname);
if (!host) {
snprintf(tmp, sizeof(tmp), "No such address: %s\n", hostname);
printf("Host lookup failed", tmp);
return -1;
}
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr = *((struct in_addr *)host->h_addr);
servaddr.sin_port = htons(SERVPORT);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); //发送时限
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); //接收时限
if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
(const char* ) &on, sizeof (on)) == -1)
{
printf("Error:Failed to set socket option SO_REUSEADDR\n");
close(sock);
exit(1);
}
serlen = sizeof(servaddr);
sendto(sock,sentbuf,MAXDATASIZE,0,(struct sockaddr*)&servaddr,serlen);
fromLen = sizeof(fromAddr);
int n;
n = recvfrom(sock,recvBuffer,MAXDATASIZE,0,(struct sockaddr*)&fromAddr,&fromLen);
if(n<0)
{
if (errno == EWOULDBLOCK)
{
fprintf(stderr,"socket timeout \n");
}
else
{
printf("recefrom error \n");
}
}
printf("I receave a data %s \n",recvBuffer);
input_data *s;
s = (input_data *)malloc(input_data_len);
if (NULL == s)
{
exit;
}
memset(s, 0, input_data_len);
memcpy(s->inbuf,recvBuffer,sizeof(s->inbuf));
s->inlen = strlen(recvBuffer);
char *res;
res = parse_result(s,"Call-ID");
if(res)
printf("the result is %s \n",res);
else
printf("not found result ----- \n");
close(sock);
return 0;
}
static char *parse_result(input_data *s,char *var)
{
char *tmp;
char *result;
char *res;
char cmp[80];
snprintf(cmp, sizeof(cmp), "%s: ", var);
tmp = s->inbuf;
if(!tmp || *tmp == '\0')
{
printf("no data return \n");
return 0;
}
while(1){
res = strstr(tmp,"\r\n");
if(res)
{
*res = '\0';
res += 2;
if (strstr(tmp,var))
{
result = tmp + strlen(cmp);
return result;
}
tmp = res;
}
else
{
return NULL;
}
}
}
分享到:
相关推荐
本篇将深入探讨如何利用C#编写一个UDP服务器程序,实现数据的发送与接收。 首先,UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序或完整性,但具有低延迟和高效的特点,适合实时数据传输,如在线游戏和...
在标题提到的"UDP服务器+客户端程序"中,我们可以理解为这是一个包含两个主要部分的应用:服务器端和客户端。服务器端负责监听特定端口,接收客户端发送的数据,并可选择性地进行响应。客户端则负责向服务器发送数据...
在标题和描述中提到的"UDP服务器和客户端程序",这是指使用UDP协议进行通信的两个程序实例,一个作为服务端接收数据,另一个作为客户端发送数据。通常,开发这样的程序需要理解以下几个关键概念: 1. **端口号**:...
在UDP服务器程序中,主要涉及以下几个关键知识点: 1. **UDP协议原理**: UDP是一种简单的协议,它不提供连接建立、流量控制、拥塞控制等机制。每个UDP数据报独立发送,可能会乱序、重复或丢失,但具有低延迟和...
本DEMO展示了如何在QT环境下使用UDP进行通信,即创建一个简单的UDP服务器和客户端,实现数据的双向传输。 首先,让我们从`main.cpp`开始。这个文件是程序的入口点,通常包含了应用的主要逻辑和窗口对象的实例化。在...
在C#中,`System.Net.Sockets`命名空间提供了Socket类,我们可以使用它来创建UDP服务器。 创建UDP服务器的关键步骤包括: 1. **初始化Socket对象**:首先,你需要创建一个`Socket`实例,并指定其地址族(通常为`...
1. **System.Net.Sockets命名空间**:这是C#中处理网络通信的核心部分,提供了Socket类,可以用来创建UDP客户端和服务器。 2. **UdpClient类**:它是专门用于UDP通信的类,提供了发送和接收数据报的方法。例如,`...
在这个UDP服务器程序中,客户端能够通过命令行输入字符串,这些字符串将通过UDP套接字被发送到服务器。UDP套接字是应用程序与网络层交互的接口,用于发送和接收UDP数据报文。在服务器端,它会监听特定的端口,等待...
1. **创建 UDP 客户端与服务器端**:客户端需要知道服务器的 IP 地址和端口号,然后创建一个 `UdpClient` 实例。服务器端也需要监听特定的 IP 和端口,同样创建 `UdpClient` 对象,并使用 `BeginReceive` 方法启动...
- 绑定端口:服务器程序首先需要绑定到一个特定的IP地址和端口号,以便接收来自客户端的数据包。 - 接收数据:服务器通过调用recvfrom函数,等待接收来自任何客户端的数据包。此函数会返回发送者的信息和接收到的...
在这个实例中,我们将探讨如何使用C#进行UDP网络编程,包括创建UDP客户端(UDPClient)和服务器(UDPServer)。 在C#中,我们可以使用System.Net.Sockets命名空间中的UdpClient类来实现UDP通信。首先,让我们从UDP...
无论是客户端还是服务器,都需要创建`UdpClient`实例,并通过其提供的方法来收发数据。 **服务器端实现** 服务器端首先需要监听特定的IP地址和端口号。在C#中,可以使用`UdpClient.Bind()`方法指定本地端口。然后,...
标题中的“UDP.rar_java udp_udp java_udp 服务器_udp显示界面”揭示了这是一个关于...它展示了如何用Java编写UDP服务器和客户端,以及如何将这些通信功能与用户友好的界面相结合,以实现一个简单的局域网聊天应用。
总的来说,MFC中的UDP打洞实例是一个实用的学习资源,它涉及到P2P通信、NAT穿透和MFC的网络编程等多个知识点。通过理解和实践,你可以掌握构建P2P聊天程序的关键技术,并扩展到其他需要穿越NAT的应用场景。
UDP(User Datagram Protocol)...总之,"UDP通讯服务器端程序"是一个学习和实践UDP通信的好工具,它涵盖了UDP服务器端编程的基本要素和技巧,对于开发者来说,深入理解并实践这个程序,可以提升在网络编程领域的技能。
7. **实际应用案例**:这个实例可能包含一个简单的UDP客户端和服务器程序,用于演示如何在嵌入式设备上进行数据交换。这对于物联网(IoT)设备、远程监控系统、智能家居等应用非常有用。 通过这个"lwip+udp项目实例...
本书全面介绍了使用Visual C++开发各种网络程序的方法与技巧,内容涵盖TCP和UDP的客户/服务器编程、Internet和LAN上的远程PC控制、链路层的计算机扫描技术、路由跟踪技术、IP欺骗技术、密码截获及保护技术、网络封包...
本教程将详细阐述如何使用C# WinForms来搭建一个简单的UDP服务器。 首先,你需要了解C#的基础语法和WinForms控件的使用。WinForms是.NET Framework提供的一个用于创建桌面应用的用户界面框架。在创建UDP服务器的...
本篇主要讲解如何使用Java技术编写UDP实例程序,特别是实现基于UDP协议的Echo协议,以及涉及的`DatagramSocket`类和`DatagramPacket`类。 1. **创建数据报套接口的DatagramSocket类** `DatagramSocket`是Java中...
- UDP服务器通常会设置一个异步接收事件,例如使用`Socket.BeginReceiveFrom()`方法启动异步接收操作,然后在回调函数中处理接收到的数据。 - 客户端可能会有发送按钮事件,触发数据发送。 4. **多线程**: - ...