FTP 使用套接字编程
FTP using Socket Progarmming
所以我尝试使用套接字编程实现一个基本的文件读取程序。我正在使用 TCP 连接到服务器。客户端发送文件名,服务器读取它并将其内容发送回客户端。
问题是我在服务器程序中遇到错误:
Segmentation fault: 11
以下是节目:
Server.c
#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include <netinet/in.h>
int main()
{
int s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(1999);
saddr.sin_addr.s_addr=htonl(INADDR_ANY);
socklen_t slen=sizeof(saddr);
bind(s,(struct sockaddr*)&saddr,slen);
printf("Server Running..\n");
listen(s,5);
struct sockaddr_in caddr;
socklen_t clen=sizeof(caddr);
int ad=accept(s,(struct sockaddr*)&caddr,&clen);
printf("Client Connected\n");
FILE *fp;
char buff[1024],file[1000];
while(1)
{
bzero(&buff,sizeof(buff));
bzero(&file,sizeof(file));
recv(ad,buff,sizeof(buff),0);
fp=fopen(buff,"r");
fread(file,sizeof(file),1,fp);
send(ad,file,sizeof(file),0);
}
close(s);
}
Client.c
#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include<strings.h>
int main()
{
int s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(1999);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
socklen_t slen=sizeof(saddr);
connect(s,(struct sockaddr*)&saddr,slen);
char b[1024],f[1000];
while(1)
{
bzero(&b,sizeof(b));
bzero(&f,sizeof(f));
printf("Enter the name of file : ");
fgets(b,sizeof(b),stdin);
send(s,b,sizeof(b),0);
recv(s,f,sizeof(f),0);
printf("The contents are : %s", f);
}
}
谁能告诉我这里可能出现的错误?
你从不检查 fopen().
的结果它可能失败了,因为客户端正在使用 fgets()
并且在输入缓冲区中留下了换行符。所以文件名末尾有一个额外的 \n
。此外,您永远不会关闭文件。
所以我尝试使用套接字编程实现一个基本的文件读取程序。我正在使用 TCP 连接到服务器。客户端发送文件名,服务器读取它并将其内容发送回客户端。 问题是我在服务器程序中遇到错误:
Segmentation fault: 11
以下是节目:
Server.c
#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include <netinet/in.h>
int main()
{
int s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(1999);
saddr.sin_addr.s_addr=htonl(INADDR_ANY);
socklen_t slen=sizeof(saddr);
bind(s,(struct sockaddr*)&saddr,slen);
printf("Server Running..\n");
listen(s,5);
struct sockaddr_in caddr;
socklen_t clen=sizeof(caddr);
int ad=accept(s,(struct sockaddr*)&caddr,&clen);
printf("Client Connected\n");
FILE *fp;
char buff[1024],file[1000];
while(1)
{
bzero(&buff,sizeof(buff));
bzero(&file,sizeof(file));
recv(ad,buff,sizeof(buff),0);
fp=fopen(buff,"r");
fread(file,sizeof(file),1,fp);
send(ad,file,sizeof(file),0);
}
close(s);
}
Client.c
#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include<strings.h>
int main()
{
int s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(1999);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
socklen_t slen=sizeof(saddr);
connect(s,(struct sockaddr*)&saddr,slen);
char b[1024],f[1000];
while(1)
{
bzero(&b,sizeof(b));
bzero(&f,sizeof(f));
printf("Enter the name of file : ");
fgets(b,sizeof(b),stdin);
send(s,b,sizeof(b),0);
recv(s,f,sizeof(f),0);
printf("The contents are : %s", f);
}
}
谁能告诉我这里可能出现的错误?
你从不检查 fopen().
的结果它可能失败了,因为客户端正在使用 fgets()
并且在输入缓冲区中留下了换行符。所以文件名末尾有一个额外的 \n
。此外,您永远不会关闭文件。