Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 服务器应用程序中存在错误的文件描述符问题_C_Http_Streaming_Posix_File Descriptor - Fatal编程技术网

C 服务器应用程序中存在错误的文件描述符问题

C 服务器应用程序中存在错误的文件描述符问题,c,http,streaming,posix,file-descriptor,C,Http,Streaming,Posix,File Descriptor,目前我正在做一个项目,我正在使用我找到的一个小小的C应用程序将视频流传输到HTML5-GUI 对于一些基本的事情,这段代码工作得很好。我唯一想更改的是从另一个文件中读取视频文件的文件大小。因此,我在C中读取文件: char file_buf[32]; input = fopen("size.dat", "r"); fgets(file_buf, 32, input); num_chunks = atoi(file_buf); videosize = (num_chunks-1)*1024; f

目前我正在做一个项目,我正在使用我找到的一个小小的C应用程序将视频流传输到HTML5-GUI

对于一些基本的事情,这段代码工作得很好。我唯一想更改的是从另一个文件中读取视频文件的文件大小。因此,我在C中读取文件:

char file_buf[32];
input = fopen("size.dat", "r");
fgets(file_buf, 32, input);
num_chunks = atoi(file_buf);
videosize = (num_chunks-1)*1024;
fclose(input);
printf("videosize: %d",videosize);
现在,我得到了一个“坏文件描述符”错误,即使我没有替换任何其他代码。这里有什么问题

编辑:越来越多地测试应用程序,故障似乎很随机。。。。有什么想法吗

Edit2:错误发生在应该接受套接字时。代码如下所示:

if((socketfd = socket(AF_INET,SOCK_STREAM,0))==-1){
        printf("Socket creation failed!\n");
    }
printf("Socket Creation: %s\n",strerror(errno));

bzero(&sockserv,sizeof(sockserv));

sockserv.sin_family = AF_INET;
sockserv.sin_addr.s_addr = INADDR_ANY;
sockserv.sin_port = htons(8080);

if(bind(socketfd,(struct sockaddr *)&sockserv,sizeof(sockserv))<0)
    {
    printf("Error binding the socket\n");
    }
printf("Socket Bind: %s\n",strerror(errno));

if(listen(socketfd,1) == -1){
printf("Listening to Socket failed \n");
}
printf("Socket Listen: %s\n",strerror(errno));

clientfd = accept(socketfd,(struct sockaddr*) &sockclient,&clientsocklen);
if(clientfd  < 0){
    printf("Accepting Socket failed!\n");
}
if((socketfd=socket(AF\u INET,SOCK\u STREAM,0))=-1){
printf(“套接字创建失败!\n”);
}
printf(“套接字创建:%s\n”,strerror(errno));
bzero(&sockserv,sizeof(sockserv));
sockserv.sin_family=AF_INET;
sockserv.sin\u addr.s\u addr=INADDR\u ANY;
sockserv.sin_port=htons(8080);

如果(bind(socketfd,(struct sockaddr*)&sockserv,sizeof(sockserv))我猜您的问题是因为在重新启动应用程序时绑定的地址没有被正确地重用。请查看
以便重新使用eaddr
选项。具体来说,您应该在
绑定()
之前使用
设置它

检查
input!=NULL
input是否正常。进行了一些研究并查看了代码,atoi()似乎出现了问题。测试了strtol(),似乎也不太好…您链接到的代码和发布的代码不会检查任何错误,并且它有多个潜在的缓冲区溢出漏洞。开始修复代码,并为所有可能失败的调用添加错误检查。感谢您的评论。您是否有可能出现缓冲区溢出问题的示例e在此代码中?当应用程序想要读取传入数据时失败。请注意,该函数自
IEEE Std 1003.1-2001
以来已被弃用,应替换为调用。