gpt4 book ai didi

c - 如何将数据插入 C 中 csv 文件的同一行?

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:50 24 4
gpt4 key购买 nike

我编写了一个 C 程序,它以混杂模式(客户端)捕获原始数据包,将其写入文件并通过套接字将其发送到服务器。服务器处理数据包(tcp、udp、icmp 等)并将其写入 csv 文件,然后用于分析数据包。

我的 csv 文件看起来像这样:(这里我没有显示列标题名称。'0' 表示 udp 数据包,其余是它的标题字段)

enter image description here

但我希望我的 csv 文件是这样的:

enter image description here

我想在同一行中打印客户地址,但我做不到。谁能指导我去做。

我的服务器代码是:

int main()
{
int new_sockfd,new1_sockfd,x1,x2,log,n;
int server_len, client_len;
struct sockaddr_in serveraddress;
struct sockaddr_in client_address;
char clntName1[INET_ADDRSTRLEN];
FILE *ta_address;
int buffsize=1024;
char buffer2[1024];

if((new_sockfd = socket(AF_INET,SOCK_STREAM,0))>0)

printf("\n ******** Interface Server *******\n");
printf("\n Socket was created\n");

serveraddress.sin_family = AF_INET;
serveraddress.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddress.sin_port = ntohs(9735);
server_len = sizeof(serveraddress);
bind(new_sockfd, (struct sockaddr *)&serveraddress, server_len);

listen(new_sockfd, 5);
while(1)
{
char ch;

printf("\n\n Interface Server waiting...\n");

client_len = sizeof(client_address);
new1_sockfd = accept(new_sockfd,(struct sockaddr *)&client_address, &client_len);
if (new1_sockfd==-1)
{
perror("Connection Not Accepted!!"); return(1);
}
else
{
printf("\n Task agent is connected\n");
}

//this line is used to print the ip adderss of the client
if(inet_ntop(AF_INET,&client_address.sin_addr.s_addr,
clntName1,sizeof(clntName1))!=NULL)
{
ta_address = fopen("final_report.csv","a+");
fprintf(ta_address,"%s\n",clntName1);
fclose(ta_address);
}

printf("\n Final Report has been generated!!\n\n");

//this line is used to create a new csv file and
log=open("final_report.csv",O_CREAT|O_RDWR|O_APPEND,0777);
if(log==-1)
{
perror("cannot open processed file\n");
return(1);
}

do
{
x1=read(new1_sockfd, buffer2,1024);
x2=write(log,buffer2,x1);
} while (x1>0);

close(log);
close(new1_sockfd);
}
}

这是用于显示 udp 数据包的行,如第一张图片所示:

fprintf(logfile , "%d,%d,%d,%d,%d\n",0,ntohs(udph->source),ntohs(udph->dest),
ntohs(udph->len),ntohs(udph->check));

最佳答案

这就是创建第一行的内容:

fprintf(ta_address,"%s\n",clntName1);

与其那样做,不如将 clntName1 的副本存储在某处,然后将其插入到读入缓冲区 2 的数据中。您必须将 buffer2 中的行分开,然后将 clntName1 放在每行的前面,并带有制表符:

write(log, clntName1, sizeof(clntName1)) ;
write(log, ",", 1) ;
write(log, pieceofbuffer2, n) ;

如果您可以使用缓冲文件 (FILE *),这会更容易一些:

fprintf(flog, "%s,%s\n", clntName1, pieceofbuffer2_withoutnl) ;

buffer2 中可能有几行。例如它的内容可能是:

"0,1985,1985,24,9991\n0,59324,5355,33,48328\n0,54595,1900,141,42243\n"

在我的示例中,您将这个 buffer2 分成几部分。每一 block 都是数字在换行符之前或之间。因此,您可以将客户名称的副本打印到长文件,然后是一个逗号,然后是一行的文本。

buffer2 永远不会将客户端名称插入其中,但您可以将客户端名称和缓冲区的各个部分混合写入日志文件。

关于c - 如何将数据插入 C 中 csv 文件的同一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com