(原)一个简单的UDP服务端和客户端程序

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


 client_main.c:

/*
 * @file client_main.c
 * @brief client of the UDP.
 * @author xiaou
 */

#include     // for sockaddr_in
#include     // for socket
#include     // for socket
#include 	   // for close()
#include       
#include        
#include         


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     // for sockaddr_in
#include     // for socket
#include     // for socket
#include 	   // for close()
#include       
#include       
#include        


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)

 

你可能感兴趣的:((原)一个简单的UDP服务端和客户端程序)