免费注册 查看新帖 |

Chinaunix

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

实践出真知,用send和recv收发0字节UDP数据报,不看UNP和RFC的打屁股 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-07 11:18 |只看该作者 |倒序浏览
客户端代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/stat.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>

//常量
#define UDP_SERVER_ADDR 0x2200000A//10.0.0.34
#define UDP_SERVER_PORT 100

//私有函数
static int init_sender(void);

int main(int argc, char *argv[])
{
        //临时变量
        int     i;
        int     udp_fd;
        char    msg[1024];

        //初始化
        bzero(msg, 1024);
        udp_fd = init_sender();
        if (0 > udp_fd) exit(-1);

        //发送
        for(i = 0; i < 1024; i+=256) {
                send(udp_fd, msg, i, 0);
                sleep(1);
        }

        exit(0);
}

static int init_sender(void)
{
        //临时变量
        int                     udp_fd;
        struct sockaddr_in      addr4;

        //创建UDP套接字
        udp_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (0 > udp_fd) return(-1);

        //初始化结构
        bzero(&addr4, sizeof(addr4));
        addr4.sin_addr.s_addr = UDP_SERVER_ADDR;
        addr4.sin_family = AF_INET;
        addr4.sin_port = UDP_SERVER_PORT;

        //绑定
        connect(udp_fd, (struct sockaddr *)&addr4, sizeof(struct sockaddr_in));

        return(udp_fd);
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-01-07 11:19 |只看该作者
服务器端代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/stat.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>

//常量
#define UDP_SERVER_ADDR 0x2200000A//10.0.0.34
#define UDP_SERVER_PORT 100

//私有函数
static int init_receiver(void);

int main(int argc, char *argv[])
{
        int     udp_fd;
        int     len;
        char    msg[1024];

        //初始化
        udp_fd = init_receiver();
        if (0 > udp_fd) exit(-1);

        //接收
        for( ; ; ) {
                len = recv(udp_fd, msg, 1024, 0);
                fprintf(stdout, "len = %d\r\n", len);
        }

        exit(0);
}

static int init_receiver(void)
{
        //临时变量
        struct sockaddr_in      addr4;
        int                     udp_fd;

        //创建SOCKET
        udp_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (0 > udp_fd) return(-1);

        //初始化结构
        bzero(&addr4, sizeof(addr4));
        addr4.sin_addr.s_addr = UDP_SERVER_ADDR;
        addr4.sin_family = AF_INET;
        addr4.sin_port = UDP_SERVER_PORT;

        //绑定
        if(0 != bind(udp_fd, (struct sockaddr *)&addr4, sizeof(struct sockaddr_in))) {
                close(udp_fd);
                return(-2);
        }

        return(udp_fd);
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-01-07 11:24 |只看该作者
Makefile内容
all: *.c
        gcc udp_server.c -Wall -O2 -o udp_server
        gcc udp_client.c -Wall -O2 -o udp_client
clean:
        rm -f udp_server udp_client

编译后
自己设置一个IP为10.0.0.34就可以运行了

论坛徽章:
0
4 [报告]
发表于 2008-01-07 12:06 |只看该作者
很好,很强大。晚上试一下。

论坛徽章:
0
5 [报告]
发表于 2008-01-07 12:07 |只看该作者
为什么不用 inet_addr?
这么做有什么深意?

论坛徽章:
0
6 [报告]
发表于 2008-01-07 12:42 |只看该作者
嗯. 不错, 支持一下.
我也是写了一个程序来验证在TCP情况下如果发送0字节的数据报, 其发送方是不会发送出去的.

论坛徽章:
0
7 [报告]
发表于 2008-01-07 13:03 |只看该作者
up,实践才是硬道理,有些人是看书时一看就会,一做就错

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2008-01-07 13:38 |只看该作者
原帖由 bobozhang 于 2008-1-7 13:03 发表
up,实践才是硬道理,有些人是看书时一看就会,一做就错

不敢苟同。
理论不掌握,实践出来的都是错的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-01-07 13:55 |只看该作者
原帖由 放驴娃 于 2008-1-7 12:07 发表
为什么不用 inet_addr?
这么做有什么深意?



我偷懒了,我上面贴的代码不可移植
我平常程序都是用下面的函数

unsigned int get_ip4(char *host)
{
        //临时变量
        char                    dns_buff[8192];
        struct hostent          hostinfo, *phost;
        struct sockaddr_in      addr4;
        int                               rc;
        unsigned int            ip4;

        //尝试直接转换
        bzero(&addr4, sizeof(struct sockaddr_in));
        if (1 == inet_pton(AF_INET, host, &(addr4.sin_addr))) return(addr4.sin_addr.s_addr);

        //查询DNS
        if (0 == gethostbyname_r(host, &hostinfo, dns_buff, 8192, &phost, &rc)) {
                ip4 = *(unsigned int *)(hostinfo.h_addr);//新记录
        } else {
                ip4 = 0;//查询失败
        }
        return(ip4);
}

论坛徽章:
0
10 [报告]
发表于 2008-01-07 13:58 |只看该作者
原帖由 safedead 于 2008-1-7 13:55 发表

我偷懒了,我上面贴的代码不可移植
我平常程序都是用下面的函数

查 DNS 的话,有时候会比较慢吧?
我一般都是直接用 IP 地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP