Tag: 套接字

在C中以块的forms将内存写入套接字

我正在尝试将内存内容写入块中的套接字。 我可以写出比我的缓冲区小的文件,但是其他任何东西,我都在深水中。 /* allocate memory for file contents */ char fileContents = malloc(sizeof(char)*filesize); /* read a file into memory */ read(fileDescriptor, fileContents , filesize); int chunksWritten; /* Write the memory to socket? */ if (filesize > MAX_BLOCK_SIZE){ while (chunksWritten < filesize){ // what goes here? } } else { chunksWritten = writen(sd, fileContents, filesize); // […]

套接字读取和时间戳

当从Linux中的(非流)套接字读取时,我可以通过ioctl(sock, SIOCGSTAMP, &tv)获取最后收到的消息的(硬件生成的)时间戳。 但是,这会带来两个问题: 这是另一个系统调用(我每秒收到大约24000条消息,所以每个系统调用都要通知) 如果使用这种方法,我一次只能read()一条消息,然后是ioctl()来获取时间戳。 (如果我在read() call中读取多条消息,则以下ioctl仅生成最后一条消息的时间戳。) 我的问题是如何在尽可能少的系统调用中实现接收消息及其时间戳。 如果存在一个具有语义的系统调用,例如“读取待处理的消息及其时间戳”,那将是完美的。

getline over socket

是否有一个libc函数可以执行与getline相同的操作,但是可以使用连接的套接字而不是FILE *流吗? 解决方法是在套接字上调用fdopen。 在这样做的时候应该注意什么。 有什么理由去做/不去做。 这样做的一个明显原因是调用getline和co,但是重写一些自定义getline可能是个更好的主意吗?

端口为零的绑定将绑定到空闲端口。 这是便携式吗?

我希望我的程序绑定到一个自由端口。 Google告诉我,使用port = 0的绑定会这样做,但是我没有发现这是否可以保证在任何系统上运行(特别是Windows / Linux)。 有人可以链接一个说这个的文档吗?

为什么C中的某些函数有下划线前缀?

我最近开始用C语言学习网络,我看到一些函数以下划线_function()开头 – 这究竟是什么意思? 我也看到了这个: struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[sizeof (struct sockaddr) – __SOCKADDR_COMMON_SIZE – sizeof (in_port_t) – sizeof (struct in_addr)]; }; 这部分代码意味着什么: __SOCKADDR_COMMON (sin_); unsigned char sin_zero[sizeof (struct sockaddr) – __SOCKADDR_COMMON_SIZE – sizeof (in_port_t) – sizeof (struct in_addr)];

接收来自N个客户端的响应,以响应UDP上的广播请求

我正在为特定类型的网络多媒体设备实现一种IP查找器。 我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节。 该设备有自己的设备发现方式。 它的工作原理如下:客户端通过UDP通过LAN发送广播请求。 目标端口号是固定的。 作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息。 我正在使用sendto()广播UDP请求消息。 现在我的问题是我不知道有多少设备(ieservers)会响应请求。 我需要多少次调用recvfrom()? 我什么时候才能知道我已经处理了所有设备的响应? 或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗? 有没有更好的(或者如果我错在这里是正确的)完成相同的方式? 我正在用C / C ++编程,计划为Windows和Linux编写代码。 提前谢谢了。 编辑:所以在这里所有的网络编程向导的帮助下,我找到了我的问题的解决方案:) select()对我来说就是这个…… 非常感谢所有花时间帮助我的人

为WinSocks和* nix创建一个非阻塞套接字

在C / C ++中,如何将阻塞套接字转换为WinSocks和* nix中的非阻塞套接字; 这样select()才能正常工作。 您可以将预处理器用于特定于平台的代码。

“’sockaddr_in’未声明(在此函数中首次使用)”错误,尽管包含必需的标题

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BACKLOG 10 void * get_in_addr(struct sockaddr *sa){ if(sa->sa_family == AF_INET){ return &((sockaddr_in *)sa)->sin_addr; } else if(sa->sa_family == AF_INET6){ return &((sockaddr_in6 *)sa)->sin6_addr; } } 我在我的代码中使用sockaddr_in结构来判断传入连接是IPv4还是IPV6地址。 尽管在我的代码中包含netinet / in.h头文件,但我收到错误“’sockaddr_in’未声明(在此函数中首次使用)”。 有没有我在这里看不到的东西?

C中的DNS客户端

我目前正在开展一个学校项目,要求我实现DNS客户端,而不使用任何库函数。 我已经到了发送DNS请求并收到回复的地步。 我在解析回复时遇到了困难。 我在char *数组中收到回复,我想将其转换为一些有意义的结构,我可以从中解析答案。 我浏览了RFC并阅读了有关数据包结构的内容,但在C中实现它会给我带来问题。 任何人都可以用C语言给我任何例子,或者用任何其他语言来解释这是如何完成的。 或者对书的任何引用也没关系。 额外细节: 所以,以下是我正在使用的结构。 struct result{ int type; struct res_ip_cname ip_cname; struct res_error error; struct res_mx_ns mx_ns; }; struct res_ip_cname{ char* lst; int sec; char* auth_flag; }; struct res_error{ char * info; }; struct res_mx_ns{ char * name; unsigned short pref; int sec; char* auth_flag; }; 我有一个char * buffer […]

如何在c 使用pcap执行扫描附近的wifi ap

基本上我想要一个简单的C代码,它说明了在混杂模式下捕获数据包并从中提取出ssid。 EDIT1 我正在编写我编写的代码来执行基本的嗅探。 #include #include int main(int argc, char *argv[]){ pcap_t *handle; struct pcap_pkthdr header; const u_char *packet; int i; char *dev, errbuf[PCAP_ERRBUF_SIZE]; // dev = pcap_lookupdev(errbuf); dev = argv[1]; if( dev == NULL ){ fprintf(stderr, “Couldn’t find default device\n”); return 0; } printf(“Device: %s\n”, dev); handle = pcap_open_live( dev , BUFSIZ , 0 , […]