免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1133 | 回复: 0
打印 上一主题 下一主题

Linux 下 UDP 服务和客户端程序示例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-05 19:09 |只看该作者 |倒序浏览

                                项目测试的需要,写了一个 Linux 系统的的 UDP 服务端和客户端小程序,方便起见,客户端和服务器端写在了一个文件里,默认启动客户端,但如果加上 -s 参数就按服务器启动。
               
               
                /************udpapplet.h***************/
#ifndef _UDP_SERVER__
#define _UDP_SERVER__
#include stdlib.h>
#include stdio.h>
#include unistd.h>
#include errno.h>
#include sys/socket.h>
#include netinet/in.h>
#define DEFAULT_SERVER_IP   "127.0.0.1"
#define DEFAULT_SERVER_PORT 4321
#define MAX_BUFSIZE 2048
typedef struct
{
    int socket_fd;
    struct sockaddr_in to_addr;
    int to_addr_len;
    char snd_buf[MAX_BUFSIZE];
    struct sockaddr_in from_addr;
    int from_addr_len;
    char rcv_buf[MAX_BUFSIZE];
    char serverIp[32];
    int serverPort;
    int isServer;
} UDP_Info_t;
#endif
/************udpapplet.c***************/
#include "udpapplet.h"
UDP_Info_t udpInfo;
int startUDPServer(UDP_Info_t * pInfo);
int startUDPClient(UDP_Info_t * pInfo);
int main(int argc, char **argv)
{
    sprintf(udpInfo.serverIp, "%s", DEFAULT_SERVER_IP);
    udpInfo.serverPort = DEFAULT_SERVER_PORT;
    if (argc > 1)
    {
        int opt;
        while (-1 != (opt = getopt(argc, argv, "a:p:s")))
        {
            switch (opt)
            {
                case 'a':
                    sprintf(udpInfo.serverIp, "%s", optarg);
                    break;
                case 'p':
                    udpInfo.serverPort = atoi(optarg);
                    break;
                case 's':
                    udpInfo.isServer = 1;
                    break;
                default:
                    fprintf(stderr, "There's some error in your parameters.\n");
            }
        }
    }
    if (udpInfo.isServer)
    {
        startUDPServer(&udpInfo);
    }
    else
    {
        startUDPClient(&udpInfo);
    }
    return 0;
}
int startUDPServer(UDP_Info_t * pInfo)
{
    int err;
    fd_set rd_set;
    struct timeval timeout;
    pInfo->socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (pInfo->socket_fd  0)
    {
        perror("socket error");
        return -1;
    }
    pInfo->from_addr_len = sizeof(pInfo->from_addr);
    bzero(&pInfo->from_addr, pInfo->from_addr_len);
    pInfo->from_addr.sin_family = AF_INET;
    pInfo->from_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    pInfo->from_addr.sin_port = htons(pInfo->serverPort);
    err = bind(pInfo->socket_fd, (struct sockaddr *)&pInfo->from_addr, pInfo->from_addr_len);
    if (err  0)
    {
        perror("bind error");
        return -1;
    }
    while (1)
    {
        memset(&timeout, 0, sizeof(struct timeval));
        timeout.tv_usec = 10000;
        
        do {
            FD_ZERO(&rd_set);
            FD_SET(pInfo->socket_fd, &rd_set);
            err = select ((pInfo->socket_fd + 1), &rd_set, NULL, NULL, &timeout);
            if (err  0)
            {
                perror("select error");
                return -1;
            }
            else if (err == 0)
            {
                break;
            }
            err = recvfrom(pInfo->socket_fd, pInfo->rcv_buf, MAX_BUFSIZE, 0, &pInfo->from_addr, &pInfo->from_addr_len);
            if (err  0)
            {
                perror("recv error");
                return -1;
            }
            else
            {
                fprintf(stderr, "recv data : %s\n", pInfo->rcv_buf);
            }
            
        } while (timeout.tv_usec > 0);
    }
    return 0;
}
int startUDPClient(UDP_Info_t * pInfo)
{
    int err;
    pInfo->to_addr_len = sizeof(struct sockaddr_in);
    memset(&pInfo->to_addr, 0, pInfo->to_addr_len);
    pInfo->to_addr.sin_family = AF_INET;
    pInfo->to_addr.sin_addr.s_addr = inet_addr(pInfo->serverIp);
    pInfo->to_addr.sin_port = htons(pInfo->serverPort);
    pInfo->socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (pInfo->socket_fd  0)
    {
        perror("socket error");
        return -1;
    }
   
    while (1)
    {
        memset(pInfo->snd_buf, 0, sizeof(pInfo->snd_buf));
        read(STDIN_FILENO, pInfo->snd_buf, sizeof(pInfo->snd_buf));
        
        err = sendto(pInfo->socket_fd, pInfo->snd_buf, sizeof (pInfo->snd_buf), 0, &pInfo->to_addr, pInfo->to_addr_len);
        if (err  0)
        {
            perror("send error");
            return -1;
        }
        else
        {
            fprintf(stderr, "send a msg to %s:%d\n", pInfo->serverIp, pInfo->serverPort);
        }
    }
    return 0;
}
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73948/showart_1108357.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP