udp的server和client例子代码

写在这里,方便调试时使用参考,代码如有雷同,纯属巧合

服务端

udp_server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define BUF_SIZE 1024

void handle_udp_msg(int fd)
{
    char buf[BUF_SIZE];
    socklen_t len;
    int count, ret;
    struct sockaddr_in client_addr;


    struct timeval timeout;
    fd_set fds;
    #endif
    while(1)
    {
        FD_ZERO(&fds);
        FD_SET(fd, &fds);

        timeout.tv_sec = 60;
        timeout.tv_usec = 0;

        memset(buf, 0, BUF_SIZE);
        len = sizeof(client_addr);

        printf("select start......\n");

        ret = select(fd+1, &fds, NULL, NULL, &timeout);

        printf("select end..........ret=%d.\n", ret);
#if 0
        if(ret == 0)
        {
            printf("select time out#######continue\n");
            continue;
        }

扫描二维码关注公众号,回复: 4691112 查看本文章

        if(ret == -1)
        {
            perror("select error");
            break;
        }
#endif
        if(FD_ISSET(fd,&fds))
        count = recvfrom(fd, buf, BUF_SIZE, 0, (struct sockaddr*)&client_addr, &len);
        if(count == -1)
        {
            printf("recieve data fail!\n");
            return;
        }

        printf("recv client:%s\n", buf);

        sendto(fd, buf, BUF_SIZE, 0, (struct sockaddr*)&client_addr, len);
    }
}

int main(int argc, char* argv[])
{
    int server_fd, ret;
    struct sockaddr_in ser_addr;

    if(argc != 2)
    {
        printf("Usage: %s <port> \n", argv[0]);
        return -1;
    }

    server_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(server_fd < 0)
    {
        printf("create socket fail!\n");
        return -1;
    }

    memset(&ser_addr, 0, sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    ser_addr.sin_port = htons(atoi(argv[1]));

    ret = bind(server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
    if(ret < 0)
    {
        printf("socket bind fail!\n");
        return -1;
    }

    handle_udp_msg(server_fd);

    close(server_fd);
    return 0;
}

客户端

udp_client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

#define BUF_SIZE 512

void udp_msg_sender(int fd, struct sockaddr* dst)
{
    socklen_t len;
    struct sockaddr_in src;
    char message[BUF_SIZE];
    while(1)
    {
        len = sizeof(*dst);
        fputs("Input message:(输入Q退出):", stdout);
        fgets(message, BUF_SIZE, stdin);
        if(!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
            break;

        sendto(fd, message, BUF_SIZE, 0, dst, len);
        memset(message, 0, BUF_SIZE);
        recvfrom(fd, message, BUF_SIZE, 0, (struct sockaddr*)&src, &len);
        printf("recv server message:%s\n",message);
    }
}

int main(int argc, char* argv[])
{
    int client_fd;
    struct sockaddr_in ser_addr;

    if(argc != 3)
    {
        printf("Usage: %s <IP> <port> \n", argv[0]);
        return -1;
    }

    client_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(client_fd < 0)
    {
        printf("create socket fail!\n");
        return -1;
    }

    memset(&ser_addr, 0, sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = inet_addr(argv[1]);
    ser_addr.sin_port = htons(atoi(argv[2]));

    udp_msg_sender(client_fd, (struct sockaddr*)&ser_addr);

    close(client_fd);

    return 0;
}

调用方法

./udp_server  port   // 启动服务

./udp_client   server_ip  port   //客户端访问服务端

客户端输入,服务端接收反馈

猜你喜欢

转载自blog.csdn.net/megan_free/article/details/85283902
今日推荐