- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的教授指示我们手动制作 UDP 请求并发送。到目前为止,我已经构建了 UDP header 和内容指针。问题是 sendto
函数需要数据结构 sockaddr
而我所拥有的只是指示目标 ipv4 的字符串。 .
那么知道如何将这个字符串转换成那个结构,或者是否有不同的发送消息?
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
static void die (const char * format, ...)
{
va_list vargs;
va_start (vargs, format);
vfprintf (stderr, format, vargs);
fprintf (stderr, ".\n");
exit (1);
}
void copy_lower_16_int(void * dest,int value)
{
size_t sz =sizeof(value);
if(sz == 2)
memcpy(dest,&value,2);
else if (sz >2)
{
memcpy(dest,(&value)+sz-2,2);
}
}
int sendTo(void * message,size_t size ,char * destinationIP,unsigned short destinationPort)
{
// Get the target transport protocol number
const char* protocol_name="udp";
struct protoent* protocol=getprotobyname(protocol_name);
if (!protocol) {
die("Protocol %s not found",protocol_name);
}
int protocol_number=protocol->p_proto;
printf(" Protocol %s has number of %d \n",protocol_name,protocol_number);
// Create raw socket for usage with IPv4 & the specified transport protocol (UDP)
int fd=socket(AF_INET,SOCK_RAW,protocol_number);
if (fd==-1) {
die("Failed to create a raw socket, error : %s",strerror(errno));
}
// Construct the UDP datagram
//Calculate total size ( message size + 8 byte for the headers)
size_t total_size = size + 8;
// Calculate the checksum
int checksum = 0x53AF;
void * content = (void*) malloc(total_size);
const int sourcePort = 1524;
copy_lower_16_int(content,sourcePort);
copy_lower_16_int(content+2,destinationPort);
copy_lower_16_int(content+4,total_size);
copy_lower_16_int(content+6,checksum);
memcpy(content+8,message,size);
}
void main(){
printf("Size of int is %d",sizeof(2));
sendTo("Cx",2,"127.0.0.1",5405);
}
最佳答案
我通过使用 getaddrinfo
解决了我的问题,如下所示
struct addrinfo *addr_result;
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_RAW; /* Datagram socket */
hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
hints.ai_protocol = protocol_number; /* Any protocol */
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
getaddrinfo(destinationIP,NULL,&hints,&addr_result);
//Send the damn message
ssize_t sentsz = sendto(fd,content,total_size,0,addr_result->ai_addr,addr_result->ai_addrlen);
if (sentsz == -1)
{
printf("It failed to send !!");
}
else {
printf("It did send %d bytes",sentsz);
}
// free allocated memory
free(content);
freeaddrinfo(addr_result);
关于c - 在 C 中发送手工制作的 UDP 数据报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433351/
我想学习如何手工计算散列(比如用纸和铅笔)。这可行吗?任何有关从哪里了解这一点的指示都将不胜感激。 最佳答案 这取决于你想做的散列。您可以非常轻松地手动执行一个非常简单的散列——例如,一个简单的散列是
我正在为 IDA Pro 编写脚本使用 idapython 在 Python 中进行反汇编插入。使用它,我能够填补 IDA 自动分析不足的空白。 让我感到难过的一个领域是用(需要一个更好的术语)“漂亮
我找到了一个展示如何手动计算 LCC 的示例(见图)。 如何在 R 中复制这些步骤?重点是找到“邻居之间的实际链接数”(中间步骤) 我最好手动计算一下 *igraph包有提供这个数字吗? 示例邻接矩阵
我正在尝试像 Apple 的 TextSizingExample 那样手动组装 NSTextView 并发现一个无聊的错误。如果您运行 TextSizingExample 并选择“环绕滚动文本”模式,
我想手动制作 TLS 客户端 Hello 消息或至少使用 OkHttp 客户端指定下一个值: TLS 版本 密码 扩展 椭圆曲线 椭圆曲线点格式 可能吗? 最佳答案 见 https://square.
我是一名优秀的程序员,十分优秀!