网络骇客入门之UDP编程

本文列出了在LINUX系统下使用C语言进行UDP收发操作的常用函数和用法

注意:

创建套接字时,系统会分配一个临时端口,默认主动发起服务请求,作为服务器时可修改为被动

发送数据时,不需要用bind绑定端口(当然绑定也可以)

接收数据时,如果不想知道发送者的信息(如:IP地址,端口等),可以不创建发送者结构体,然后recvfrom的后两个参数写NULL

因为网络上的字节序是大端格式(低地址存高字节),所以在发送数据和显示接收的数据时要用htonl/htons和ntohl/ntohs转换(即host to net long/short和net to host long/short)

如果是IP地址,常用inet_pton/inet_ntop

inet_pton(AF_INET, "10.220.4.100", &dst_addr.sin_addr);

char cli_ip[16] = "";

inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, sizeof(cli_ip));

当然inet_addr("10.220.4.100")也可以,不过年纪大了,不中用了。

1发送数据

1.1.头文件

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

main()函数

1.2创建套接字

int sockedfd = 0;

sockedfd = socket(AF_INET,SOCK_DGRAM,0);//创建UDP套接字

if(sockedfd < 0)

{

perror("socket");

exit(-1);

}

1.3发送消息缓冲区

char buf[100]="hello";

1.4填充发送结构体

struct sockaddr_in dst_addr;//目的结构体

bzero(&dst_addr,sizeof(dst_addr));

dst_addr.sin_family = AF_INET;//协议类型

dst_addr.sin_port = htons(8080);//目的端口

inet_pton(AF_INET, "10.220.4.100", &dst_addr.sin_addr); //目的IP地址

1.5发送数据,返回发送的字节数

int len = sendto(sockedfd,buf,strlen(buf),0,(struct sockaddr *)&dst_addr,sizeof(dst_addr));

printf("len = ==%d\n",len);

1.6

关闭套接字

close(sockedfd);

2接收数据

2.1创建套接字

int sockedfd = 0;

sockedfd = socket(AF_INET,SOCK_DGRAM,0);//创建UDP套接字

if(sockedfd < 0)

{

perror("socket");

exit(-1);

}

//填充接收结构体

struct sockaddr_in my_addr;//接收结构体

bzero(&my_addr,sizeof(my_addr));

my_addr.sin_family = AF_INET;//协议类型

my_addr.sin_port = htons(8080);//接收端口

my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//接收IP地址设为任意IP

int err;

//绑定接收端口,便于其它机器访问

err = bind(sockedfd,(struct sockaddr*)&my_addr,sizeof(my_addr));

if(err != 0)

{

perror("bind");

close(sockedfd);

exit(-1);

}

//定义接收缓冲区

char buf[100]="";

//创建发送者结构体,用于储存发送者信息

struct sockaddr_in src_addr;

bzero(&src_addr,sizeof(src_addr));

//发送者结构体的大小

int len=sizeof(src_addr);

//从套接字接收数据

recvfrom(sockedfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,&len);

//显示发送端口

printf("port == %d\n",ntohs(src_addr.sin_port));

关闭套接字

close(sockedfd);

下面介绍一下类似于迅雷等下载器的tftp协议

TFTP即简单文本传输协议,工作在应用层,基于UDP,不进行用户认证

只要往69号端口按固定的消息格式发送一条文件请求,另一边的服务器就会把请求的文件发送过来

消息格式:操作码+文件名+0+传输模式+0其中操作码为2字节(1读,2写,3数据,4确认,5错误)

数据包格式为操作码3(2B)+编号(2B)+数据,收到数据包后要发送确认包 操作码4(2B)+块编号

如果数据包小于516字节则说明接收完毕。

具体程序如下:

前面的步骤都一样了

char sendbuf[512]="";

int len = sprintf(sendbuf,"%c%c%s%c%s%c",0,1,“hello.txt”,0,"octet",0);//"octet"为二进制模式,“netascii”为文本模式

sendto(sockfd,sendbuf,len,0,(struct sockaddr*)&dest_addr,sizeof(dest_addr));

发送完了立刻进行接收

do{

//接收服务器发送的内容

len = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&client_addr, &cliaddr_len);

cmd = recv_buf[1];

if( cmd == 3 )//是否为数据包

{

//包编号是否和上次相等

if( (unsigned short)(p_num+1) == ntohs(*(unsigned short*)(recv_buf+2) ))

{

write(fd, recv_buf+4, len-4);

p_num = ntohs(*(unsigned short*)(recv_buf+2));

printf("recv:%d\n", p_num);//十进制方式打印包编号

}

recv_buf[1] = 4;//操作码+1从数据包变为确认包

sendto(sockfd, recv_buf, 4, 0, (struct sockaddr*)&client_addr, sizeof(client_addr));

}

else if( cmd == 5 ) //是否为错误应答

{

close(fd);

close(sockfd);

unlink(argv[2]);

printf("error:%s\n", recv_buf+4);

return 0;

}

}while(len == 516); //如果收到的数据小于516则认为出错

close(fd);

close(sockfd);

原文地址:http://blog.51cto.com/13603157/2095500

时间: 2024-11-09 02:14:52

网络骇客入门之UDP编程的相关文章

网络骇客入门之TCP并发网页服务器

TCP并发服务器本来准备写在网络骇客入门之TCP编程后面的,但是因为代码有点长,所以就单独写了一篇 注意: 因为浏览器发送的数据比较多,所以作为本服务器的接受缓冲区recv_buf要大点,至少512字节,建议1024字节 如果接收不全的话,无论如何都不能将网页传给浏览器,这个bug卡了我一晚上,所以记得特别清楚. 创建线程时传给线程的参数注意写连接套接字的值,先转换为(void*)类型, pthread_create(&pth,NULL,msg_echo,(void *)connfd); 再在线

网络骇客初级之原始套接字(SOCK_RAW)

本文用实际程序完成了MAC数据包分析,网络数据分析,MAC地址扫描器和飞秋欺骗 在这里我把原来的入门改成了初级,因为对于原始套接字的操作确实在普通的TCP,UDP之上 TCP和UDP确实涵盖了普通的网络应用程序,但请注意"普通"二字,要成为一名骇客的你,可不能仅仅满足于写一些普通的网络小程序,而要直接对所有数据包进行分析,还要能够发送自己组装的数据包,踏入高级网络编程的领域,编写一些奇特的网络程序(嘿嘿!). 注意所有程序都是在LINUX系统下实现的,当然在windows下不是不行,只

TCP和UDP编程时区别

一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息 拥有大量Client 对数据安全性无特殊要求 网络负担非常重,但对响应速度要求高 具体编程时的区别 socket()的参数不同 UDP Server不需要调用listen和accept UDP收发数据用sendto/rec

[C# 网络编程系列]专题六:UDP编程

转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的)底层的传输基础,所以在本专题中就简单介绍下UDP的工作原理和UDP编程的只是,希望可以对刚接触网络编程的朋友起到入门的作用. 一.UDP介绍 UDP和TCP都是构建在IP层

嵌入式 Linux网络编程(三)——UDP编程模型

嵌入式 Linux网络编程(三)--UDP编程模型 UDP编程模型: UDP循环服务器模型为: socket(...); bind(...); while(1) {    recvfrom(...);    process(...);    sendto(...); } server.c代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #inc

Linux 网络编程——UDP编程

概述 UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议.UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地.由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快. UDP 有如下的特点: 1)邮件系统服务模式的抽象(可通过邮件模型来进行对比) 2)每个分组都携带完整的目的

Node.js开发入门—UDP编程

Node.js也提供了UDP编程的能力,相关类库在"dgram"模块里. 与TCP不同,UDP是无连接的,不保障数据的可靠性,不过它的编程更为简单,有时候我们也需要它.比如做APP的统计或者日志或者流媒体,很多流媒体协议都会用到UDP,网上一搜一大堆. 使用UDP,如果你要发送数据,只需要知道对方的主机名(地址)和端口号,扔一消息过去即可.至于对方收不收得到,听天由命了.这就是数据报服务,类似快递或邮件. 我们这次来介绍一下Node.js里的UDP编程,我会提供一个UDP版本的echo

Java笔记二十三.网络编程基础与UDP编程

网络编程基础与UDP编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.网络编程基础 1.TCP/IP协议:TCP/IP协议是一个非常实用的网络应用程序通信协议,包括TCP(传输控制协议)和IP地址(计算机唯一标识号). 2.IP地址:IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证),通过这个标识号来指定接收数据的计算机和识别发送数据的计算机,该标识号即为IP地址. (1)Ipv4:指在计算机中IP地址用4个字节(

网络编程之UDP编程

网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报.值得注意的是:UDP编程必须先由客户端发出信息.一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中).端口与协议相关,所以TCP的30