问题描述
抱歉几乎不可读,我一直在改变变量和值以及 printf'ing 调试语句,所以我可以追踪我的错误,但我似乎无法找到导致我在 57 时读取挂起的原因.
fcntl 在 40 时停止读取,在 18 时停止读取,但在 57 时不会做同样的事情。
这是服务器文件。
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
void write_file(int sockfd)
{
printf("1.0\n");
int data,filenamdat,st,errnum,bytesize;
FILE *fp;
char fileName[100];
char byte[16];
printf("1.1\n");
filenamdat = read(sockfd,fileName,100);
fcntl(sockfd,F_SETFL,O_NONBLOCK);
printf("%s\n",fileName);
if(filenamdat == -1)
{
printf("filenamedat...\n");
errnum = errno;
fprintf(stderr,"Value of errno: %d\n",errno);
perror("Error printed by perror");
fprintf(stderr,"Error opening file: %s\n",strerror( errnum ));
exit(0);
}
printf("1.2\n");
char *buffer;
buffer = (char*)malloc(sizeof(buffer)*sizeof(char));
char filenameadd[107] = "SERVER";
strcat(filenameadd,fileName);
printf("1.3.0\n");
fp = fopen(filenameadd,"w");
printf("1.3.1\n");
printf("%s\n",filenameadd);
st = read(sockfd,byte,16);
fcntl(sockfd,O_NONBLOCK);
printf("1.3.2\n");
bytesize = atoi(byte);
if(st == -1)
{
printf("st...\n");
errnum = errno;
fprintf(stderr,strerror( errnum ));
exit(0);
}
printf("1.4\n");
//This entire while loop is basically the issue.
while (1)
{
printf("1.5\n");
data = read(sockfd,buffer,1024);
//This is the read that hangs no matter what I do.
//I set it equal to an int and then did an errno check to see what the problem was.
//It says resource already in use but I cant seem to find a solution to it.
if(data == -1)
{
printf("readbuffer...\n");
errnum = errno;
fprintf(stderr,errno);
perror("Error printed by perror");
fprintf(stderr,strerror( errnum ));
exit(0);
}
printf("%d\n",data);
printf("1.6\n");
if (data <= 0)
{
printf("1.91\n");
break;
return;
}
printf("1.7\n");
fprintf(fp,"%s",buffer);
printf("1.8\n");
bzero(buffer,1024);
printf("1.9\n\n");
}
return;
}
void sendFile()
{
}
void server()
{
int sockfd,sock,portnum,connfd,errnum;
int opt = 1;
struct sockaddr_in addr,client = {};
char* addrbuff;
addrbuff = (char*)malloc(sizeof(addrbuff)*sizeof(void*));
portnum = 8080;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if (sockfd == -1)
{
printf("Failed to create socket.\n");
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(portnum);
inet_ntop(AF_INET,&addr.sin_addr.s_addr,addrbuff,sizeof(addr));
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR | SO_REUSEPORT,&opt,sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
if ((bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))) != 0)
{
printf("Failed to bind socket.\n");
printf("Connection with the server Failed...\n");
errnum = errno;
fprintf(stderr,strerror( errnum ));
exit(0);
}
if ((listen(sockfd,10)) != 0)
{
printf("Failed to listen.\n");
errnum = errno;
fprintf(stderr,strerror( errnum ));
exit(0);
}
printf("Listening on %s and port %d.\n",ntohs(addr.sin_port));
socklen_t client_len = sizeof(client);
connfd = accept(sockfd,(struct sockaddr*)&client,&client_len);
if (connfd < 0)
{
printf("Accept Failed.\n");
errnum = errno;
fprintf(stderr,strerror( errnum ));
exit(0);
}
char command[5];
char fileName[100];
char bytes[16];
int w,e,st;
printf("Client accepted.\n");
bzero(fileName,100);
bzero(command,5);
bzero(bytes,16);
w = read(connfd,command,5);
printf("%s\n",command);
if(strncmp(command,"PUSH",4) == 0)
{
printf("1\n");
write_file(connfd);
printf("2\n");
}
return;
}
int main(int argc,char* argv[])
{
int port;
char Address[1024];
if(argc == 1)
{
server();
}
else
{
printf("%s\n","Client/server functions never reached.");
return 0;
}
return 0;
}
这是客户端文件
我无法更改此文件,因为它是由我的合作伙伴编写的,并且是只读的。不过,它似乎正在做它应该做的一切。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
void pushFile(char *fileName,int clientSocket){
FILE *fp;
struct stat stats;
int intfileSizeinBytes;
char fileSizeinBytes[10];
int w = send(clientSocket,sizeof(fileName)+1,0);//sending filename to server
int st = stat(fileName,&stats);
if(st == -1){
printf("Error in stat method...\n");
} else {
intfileSizeinBytes = (int)stats.st_size;
intfileSizeinBytes+=2;
sprintf(fileSizeinBytes,"%d",intfileSizeinBytes);
}
printf("sizeoffilebytes: %ld\n",sizeof(fileSizeinBytes));
w = send(clientSocket,fileSizeinBytes,sizeof(fileSizeinBytes),0); //send filesize to server
if(w == -1){
printf("Error in sending file size...\n");
exit(0);
}
char data[intfileSizeinBytes];
fp = fopen(fileName,"r");
if(fp == NULL){
printf("File can't be opened...\n");
exit(0);
}
while(fgets(data,intfileSizeinBytes,fp) != NULL){
int tmp;
tmp = send(clientSocket,data,sizeof(intfileSizeinBytes),0); //sending data to server
printf("%s\n",data);
if(tmp == -1){
printf("Error in sending data...\n");
exit(0);
}
bzero(data,intfileSizeinBytes);
}
fclose(fp);
}
void pullFile(char *fileName,int clientSocket,FILE *fp){
char buff[1024],fileLength[100];
fp = fopen(fileName,"w+");
if(fp == NULL){
printf("File can't be opened...\n");
exit(0);
}
int w = send(clientSocket,sizeof(fileName),0);//send file name to server
if(w == -1){
printf("Error in sending file name\n");
exit(0);
}
w = recv(clientSocket,fileLength,100,0);//recieve file size from server
if(w == -1){
printf("Error in recieving file\n");
exit(0);
}
int intfileLength = atoi(fileLength);
char file[intfileLength]; //makes a "string" that will contain the file data
w = recv(clientSocket,buff,intfileLength,0); //recieves the actual file
fprintf(fp,file); //prints data into file
bzero(file,intfileLength);
fclose(fp);
}
int main(){
int clientSocket;
struct sockaddr_in serverAddr;
char buffer[1024];
clientSocket = socket(AF_INET,0); //creates a client socket
if(clientSocket == -1){
printf("Socket Failed...\n");
exit(0);
}
printf("Socket success...\n");
bzero(&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //Change
serverAddr.sin_port = htons(8080);
int c = connect(clientSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(c == -1){ //connects the socket to the given address
printf("Connection with the server Failed...\n");
exit(0);
}
printf("Connection with the server success...\n");
int flag = 1;
printf("This is a remote backup system.\nYou can send files,retrieve files,and exit\n");
printf("To send files type [PUSH 'filename']\n");
printf("To retrieve a file from the server type [PULL 'filename']\n");
printf("To exit type [QUIT]\n");
while(flag == 1){
char command[5];
char fileName[100];
scanf("%s",command); //%s %s
if(strncmp(command,4) == 0){
printf("Please specify file you want to transer to server:\n");
scanf("%s",fileName);
printf("%s\n",fileName);
int w = send(clientSocket,sizeof(command),0);
if(w == -1){
printf("Sending command to server Failed...\n");
exit(0);
}
pushFile(fileName,clientSocket);
printf("File sent...\n");
} else if(strncmp(command,"PULL",4) == 0){
FILE *fp;
printf("Please specify file you want to recieve from server:\n");
scanf("%s",0);
if(w == -1){
printf("Sending command to server Failed...\n");
exit(0);
}
pullFile(fileName,clientSocket,fp);
printf("File recieved...\n");
printf("PULL\n");
} else if(strncmp(command,"QUIT",4) == 0){
printf("QUIT\n");
flag--;
} else {
printf("Please enter an actual command\n");
}
}
close(clientSocket);
return 0;
}
我已经醒了 16 个小时试图解决这个问题,但完全碰壁了。即使您看到我可以做的一些小事,但任何事情都会有所帮助,以提高效率并减少意大利面。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)