接收和处理数据包时出现问题,因为我过去只发送一个不是'saddr'的缓冲区及其'size' 因此我使用结构声明所有成员ow而不是write()api中的字段缓冲区我需要发送结构变量名称。我需要在那里使用指针吗?
struct fields
{
unsigned char buffer[1024];
socklen_t saddr_size;
} data;
答案 0 :(得分:1)
首先,recvfrom
返回消息的长度。
n = recvfrom(sock,buffer,1024,0,(struct sockaddr *)&from, &length);
if (n < 0) error("recvfrom");
此处length
是您正在使用的套接字结构的大小。必须在调用recvfrom
之前对其进行初始化,以便内核知道有多少空间可用于返回套接字地址。
另请注意,(struct sockaddr *)&from
将具有用于发送数据报的远程套接字的地址。
现在,在你的电话中
data_size = recvfrom(sock_raw , buffer , 1024, 0 , &saddr , (socklen_t*)&saddr_size);
int cont= write(logfile,&data,data_size);
data_size
将具有消息的长度。但是,data
结构的大小大于data_size的大小。因此,write
可能无法将完整数据写入logfile
。
并记下KlasLindbäck的评论。这就是你需要的。
请参阅答案here。
答案 1 :(得分:0)
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
struct fields
{
unsigned char buffer[1024];
struct sockaddr saddr;
socklen_t saddr_size;
} data;
int main()
{
int saddr_size;
struct fields data; // Note: this variable will hide the global variabledata.
struct sockaddr saddr;
ssize_t data_size;
int sock_raw, logfile=1;
// Need to insert code to create raw socket.
data_size = recvfrom(sock_raw, data.buffer, 1024, 0, &data.saddr,
&data.saddr_size);
int cont = write(logfile, &data, sizeof data);
return 0;
}