zoukankan      html  css  js  c++  java
  • (原)一个简单的UDP服务端和客户端程序

    刚学linux socket。写来一个UDP发送和接受数据包的程序.


     client_main.c:

    /*
     * @file client_main.c
     * @brief client of the UDP.
     * @author xiaou
     */
    
    #include <netinet/in.h>    // for sockaddr_in
    #include <sys/types.h>    // for socket
    #include <sys/socket.h>    // for socket
    #include <unistd.h>	   // for close()
    #include <stdio.h>      
    #include <stdlib.h>       
    #include <string.h>        
    
    
    int main(int argc, char *argv[])
    {
        if(argc < 2)
        {
            printf("One argument at least!\n");
            return -1;
        }
        
        int res = 0;
        int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);
        if(sock_fd < 0)
        {
            printf("error: Create Socket Failed!");
            return -1;
        }
        
        struct sockaddr_in sock_addr;
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons(4321);
        sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        memset(sock_addr.sin_zero, 0x00, 8);
        
        try
        {        
            const char * tos = argv[1];
            int toslen = strlen(tos) + 1;
            struct sockaddr_in to = sock_addr;
            uint32_t tolen = sizeof(struct sockaddr);        
            printf("\nSending for data...\n");
            if((toslen = sendto(sock_fd, tos, toslen, 0, (struct sockaddr *)&to, tolen)) == -1)
            {
                printf("error: Sending Failed!");
                res = -1;
                throw res;
            }
            else
            {
                char s[256];
                strncpy(s, tos, toslen);
                printf("Sended data:\n[%s]\n\n", s);
            }
        }
        catch(...)
        {
            printf("error catched~");
        }
        
        close(sock_fd);
        
        return res;
    }
    

      


    server_main.c:

    /*
     * @file server_main.c
     * @brief server of the UDP.
     * @author xiaou
     */
    
    #include <netinet/in.h>    // for sockaddr_in
    #include <sys/types.h>    // for socket
    #include <sys/socket.h>    // for socket
    #include <unistd.h>	   // for close()
    #include <stdio.h>      
    #include <stdlib.h>      
    #include <string.h>       
    
    
    int main(int argc, char *argv[])
    {
        int res = 0;
        int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);
        if(sock_fd < 0)
        {
            printf("error: Create Socket Failed!");
            return -1;
        }
        
        struct sockaddr_in sock_addr;
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons(4321);
        sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        memset(sock_addr.sin_zero, 0x00, 8);
        
        try
        {
            if(bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) != 0)
            {
                printf("error: Bind Socket Failed!");
                res = -1;
                throw res;
            }
            
            char recvs[256];
            int recvslen;
            struct sockaddr_in from;
            uint32_t fromlen;
            while(1)
            {
                printf("\nWaiting for data...\n");
                fromlen = sizeof(struct sockaddr);
                if((recvslen = recvfrom(sock_fd, recvs, 256, 0, (struct sockaddr *)&from , &fromlen)) == -1)
                {
                    printf("error: Receiving Failed!");
                    res = -1;
                    throw res;
                }
                else
                {
                    if(recvslen < 256)
                        *(recvs+recvslen) = '\0';
                    else
                        *(recvs+255) = '\0';
                    printf("Received data:\n[%s]\n",recvs);
                }
            }
        }
        catch(...)
        {
            printf("error catched~");
        }
        
        close(sock_fd);
        
        return res;
    }
    

    Makefile:

    CC=g++
    CFLAGS=-Wall
    
    OutPath4UDPClient=$(HOME)/bin/test4UDPClient
    OutPath4UDPServer=$(HOME)/bin/test4UDPServer
    
    all:
    	$(CC) $(CFLAGS) -o $(OutPath4UDPClient) client_main.c
    	$(CC) $(CFLAGS) -o $(OutPath4UDPServer) server_main.c
    
    clean:
    	rm -rf $(OutPath4UDPClient)
    	rm -rf $(OutPath4UDPServer)
    

     

  • 相关阅读:
    菜鸟看懂算法以后之一:头痛的64次左移
    C语言通过指针数组和二维数组读取文件
    C++中构造函数调用构造函数
    bnuoj53075 外挂使用拒绝
    [CodeForces]String Reconstruction
    BNU-2017.7.4排位赛2总结
    BNU-2017.7.5排位赛3总结
    BNU-2017.7.3排位赛1总结
    微软大楼设计方案(困难)
    最长公共子序列针对小字符集的算法
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2512070.html
Copyright © 2011-2022 走看看