`

udp服务器程序实例

 
阅读更多

服务器程序:
#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服务器程序

    本篇将深入探讨如何利用C#编写一个UDP服务器程序,实现数据的发送与接收。 首先,UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序或完整性,但具有低延迟和高效的特点,适合实时数据传输,如在线游戏和...

    UDP服务器+客户端程序

    在标题提到的"UDP服务器+客户端程序"中,我们可以理解为这是一个包含两个主要部分的应用:服务器端和客户端。服务器端负责监听特定端口,接收客户端发送的数据,并可选择性地进行响应。客户端则负责向服务器发送数据...

    UDP服务器和客户端程序

    在标题和描述中提到的"UDP服务器和客户端程序",这是指使用UDP协议进行通信的两个程序实例,一个作为服务端接收数据,另一个作为客户端发送数据。通常,开发这样的程序需要理解以下几个关键概念: 1. **端口号**:...

    UDP服务器程序

    在UDP服务器程序中,主要涉及以下几个关键知识点: 1. **UDP协议原理**: UDP是一种简单的协议,它不提供连接建立、流量控制、拥塞控制等机制。每个UDP数据报独立发送,可能会乱序、重复或丢失,但具有低延迟和...

    在QT下的UDP服务器和客户端的简单DEMO

    本DEMO展示了如何在QT环境下使用UDP进行通信,即创建一个简单的UDP服务器和客户端,实现数据的双向传输。 首先,让我们从`main.cpp`开始。这个文件是程序的入口点,通常包含了应用的主要逻辑和窗口对象的实例化。在...

    C# Socket Udp 通信服务器端(控制台应用程序)

    在C#中,`System.Net.Sockets`命名空间提供了Socket类,我们可以使用它来创建UDP服务器。 创建UDP服务器的关键步骤包括: 1. **初始化Socket对象**:首先,你需要创建一个`Socket`实例,并指定其地址族(通常为`...

    UDP文件传输实例

    1. **System.Net.Sockets命名空间**:这是C#中处理网络通信的核心部分,提供了Socket类,可以用来创建UDP客户端和服务器。 2. **UdpClient类**:它是专门用于UDP通信的类,提供了发送和接收数据报的方法。例如,`...

    UDP.rar_udp 服务器

    在这个UDP服务器程序中,客户端能够通过命令行输入字符串,这些字符串将通过UDP套接字被发送到服务器。UDP套接字是应用程序与网络层交互的接口,用于发送和接收UDP数据报文。在服务器端,它会监听特定的端口,等待...

    C#Udp 聊天程序

    1. **创建 UDP 客户端与服务器端**:客户端需要知道服务器的 IP 地址和端口号,然后创建一个 `UdpClient` 实例。服务器端也需要监听特定的 IP 和端口,同样创建 `UdpClient` 对象,并使用 `BeginReceive` 方法启动...

    UDP_Server.rar_UDP服务器_udp server

    - 绑定端口:服务器程序首先需要绑定到一个特定的IP地址和端口号,以便接收来自客户端的数据包。 - 接收数据:服务器通过调用recvfrom函数,等待接收来自任何客户端的数据包。此函数会返回发送者的信息和接收到的...

    udp网络编程实例(CS模式)

    在这个实例中,我们将探讨如何使用C#进行UDP网络编程,包括创建UDP客户端(UDPClient)和服务器(UDPServer)。 在C#中,我们可以使用System.Net.Sockets命名空间中的UdpClient类来实现UDP通信。首先,让我们从UDP...

    基于UDP协议通信的简单客户端/服务器

    无论是客户端还是服务器,都需要创建`UdpClient`实例,并通过其提供的方法来收发数据。 **服务器端实现** 服务器端首先需要监听特定的IP地址和端口号。在C#中,可以使用`UdpClient.Bind()`方法指定本地端口。然后,...

    UDP.rar_java udp_udp java_udp 服务器_udp显示界面

    标题中的“UDP.rar_java udp_udp java_udp 服务器_udp显示界面”揭示了这是一个关于...它展示了如何用Java编写UDP服务器和客户端,以及如何将这些通信功能与用户友好的界面相结合,以实现一个简单的局域网聊天应用。

    p2p聊天程序,mfc中udp打洞实例

    总的来说,MFC中的UDP打洞实例是一个实用的学习资源,它涉及到P2P通信、NAT穿透和MFC的网络编程等多个知识点。通过理解和实践,你可以掌握构建P2P聊天程序的关键技术,并扩展到其他需要穿越NAT的应用场景。

    UDP通讯服务器端程序.rar_lift2of_udp通讯_服务器端

    UDP(User Datagram Protocol)...总之,"UDP通讯服务器端程序"是一个学习和实践UDP通信的好工具,它涵盖了UDP服务器端编程的基本要素和技巧,对于开发者来说,深入理解并实践这个程序,可以提升在网络编程领域的技能。

    lwip+udp项目实例

    7. **实际应用案例**:这个实例可能包含一个简单的UDP客户端和服务器程序,用于演示如何在嵌入式设备上进行数据交换。这对于物联网(IoT)设备、远程监控系统、智能家居等应用非常有用。 通过这个"lwip+udp项目实例...

    C++网络程序设计实例详解TCPUDP客户服务器编程

    本书全面介绍了使用Visual C++开发各种网络程序的方法与技巧,内容涵盖TCP和UDP的客户/服务器编程、Internet和LAN上的远程PC控制、链路层的计算机扫描技术、路由跟踪技术、IP欺骗技术、密码截获及保护技术、网络封包...

    C# WINFORM简答UDP服务器搭建

    本教程将详细阐述如何使用C# WinForms来搭建一个简单的UDP服务器。 首先,你需要了解C#的基础语法和WinForms控件的使用。WinForms是.NET Framework提供的一个用于创建桌面应用的用户界面框架。在创建UDP服务器的...

    java—UDP示例程序代码

    本篇主要讲解如何使用Java技术编写UDP实例程序,特别是实现基于UDP协议的Echo协议,以及涉及的`DatagramSocket`类和`DatagramPacket`类。 1. **创建数据报套接口的DatagramSocket类** `DatagramSocket`是Java中...

    VBNET的UDP客户端和服务端源码

    - UDP服务器通常会设置一个异步接收事件,例如使用`Socket.BeginReceiveFrom()`方法启动异步接收操作,然后在回调函数中处理接收到的数据。 - 客户端可能会有发送按钮事件,触发数据发送。 4. **多线程**: - ...

Global site tag (gtag.js) - Google Analytics