gpt4 book ai didi

C并发UDP套接字,奇怪的段错误

转载 作者:行者123 更新时间:2023-11-30 15:37:02 25 4
gpt4 key购买 nike

我要么很累,没有注意到一些简单的事情,要么这完全困扰着我。我遇到了段错误(核心转储),并且我已设法将其精确定位到工作函数中的 sendto() 。 (在服务器中)

服务器代码:

    //UDPServer.c

/*
* gcc -o server UDPServer.c
* ./server <port> <buffersize>
*/
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>


void err(char *str)
{
perror(str);
exit(1);
}

int sock;

typedef struct
{
struct sockaddr_in client;
int buffsize;
char *msg;
} data;

void *worker (void* asd)
{
int len;
FILE *fp;
data d;
d = *(data*) asd;
char buff[d.buffsize];
printf("Received packet from %s:%d\nData:%sSize:%d\n",
inet_ntoa(d.client.sin_addr), ntohs(d.client.sin_port)
,d.msg,d.buffsize);


char * fn;
memcpy (fn,d.msg,strlen(d.msg)-1);
fp = fopen(fn,"rb");
int bytes;
len = sizeof(d.client);
printf ("%d\n",len);

while (bytes=fread(buff,sizeof(char),d.buffsize,fp))
{
printf ("Server sent %d bytes.\n",bytes);
-> this if right here. this causes the core dump when attempting to send
if(sendto(sock , &buff , sizeof(buff),0,(struct sockaddr *)&d.client,len)<0)
err("Error sending.");

}
fclose(fp);


}


int main(int argc, char** argv)
{
struct sockaddr_in server, client;
int port, i;
socklen_t slen=sizeof(client);

if(argc != 3)
{
printf("Usage: <Port> <Bytes>\n");
exit(0);
}
else
sscanf(argv[1],"%d",&port);

int buffsize = atoi(argv[2]);

char buff[buffsize];

if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
err("socket");
else
printf("Server : Socket() successful\n");

bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(sock, (struct sockaddr* ) &server, sizeof(server))==-1)
err("bind");
else
printf("Server : bind() successful\n");

while(1)
{
memset(&buff,0,sizeof(buff));
if (recvfrom(sock, &buff, sizeof(buff), 0, (struct sockaddr*)&client, &slen)==-1)
err("recvfrom()");
data d;
d.client = client;
d.buffsize = buffsize;
d.msg = buff;

pthread_t t;
pthread_create(&t,NULL,worker,&d);
pthread_join(t,NULL);
}

return 0;
}

我认为客户端与这里无关,因为它唯一的工作就是发送文件名。顺便说一句,阅读有效,我已经测试过了。

无论如何,我只是暂时尝试发送文件的内容。在过去的一个小时里我一直在试图解决这个问题,但我一生都找不到问题所在。段错误对我来说毫无意义。

非常感谢任何建议。

最佳答案

我会对 sendto 中的 sizeof(buff) 感到紧张。 buff 的大小在运行时根据参数固定。 但是 sizeof是一个编译时操作。 (或者至少回到了过去的美好时光 - 我不确定 C99) 哦,没关系 - I see that has changed

不过,为什么不使用 d.buffsize 呢?或者可能是字节,因为您可能尚未填充缓冲区。

虽然@21Zoo关于C99中动态数组的说法是错误的,但我认为他找到了根本问题

char * fn;
memcpy (fn,d.msg,strlen(d.msg)-1);

fn 没有分配用于复制的内存,因此您正在写入内存中的随机点。sendto 中的某些内容可能会被现在包含垃圾的内存绊倒。

您需要malloc(strlen(d.msg)+1)或使用strdup

关于C并发UDP套接字,奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363595/

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