- 论坛徽章:
- 0
|
我写了个小程序为实现与sco主机的文件传输,但不用ftp,
程序在找到文件打开传输后,客户端却不能显示(乱码),不是客户端程序的问题,请版主帮忙分析下程序找到错误原因,不胜感谢!!!
×××××××××××××××××××××××××××××××××××××××
#include <stdio.h>;
#include <strings.h>;
#include <unistd.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;
#include <signal.h>;
#include <wait.h>;
#define PORT 1234
#define BACKLOG 2
#define MAXDATASIZE 1000
void process_cli(int connectfd,struct sockaddr_in client);
void sig_handler(int s);
main()
{
int listenfd,connectfd;
pid_t pid;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
struct sigaction act,oact;
int opt;
act.sa_handler=sig_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
if (sigaction(SIGCHLD,&act,&oact)<0) {
perror("sigaction failed!" ;
exit (1);
}
if ((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) {
perror("creating socket failed." ;
exit (1);
}
opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if (bind(listenfd,(struct sockaddr *)&server,
sizeof(struct sockaddr))==-1) {
perror("bind error" ;
exit (1);
}
if (listen(listenfd,BACKLOG)==-1) {
perror("listen() error.\n" ;
exit (1);
}
sin_size=sizeof(struct sockaddr_in);
while (1)
{
if ((connectfd=accept(listenfd,(struct sockaddr *)&client,
&sin_size))==-1) {
perror("accept() error\n" ;
exit (1);
}
if ((pid=fork())>;0) {
close(connectfd);
continue;
}
else if(pid==0) {
close(listenfd);
process_cli(connectfd,client);
exit (0);
}
else {
printf("fork error\n" ;
exit (0);
}
}
close(listenfd);
}
void process_cli(int connectfd,struct sockaddr_in client)
{
FILE *fp;
char ch[1000];
int num;
int i;
char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],
cli_name[MAXDATASIZE];
printf("you got a connection from %s.",inet_ntoa(client.sin_addr));
num=recv(connectfd,cli_name,MAXDATASIZE,0);
if (num==0) {
close(connectfd);
printf("client disconnected.\n" ;
return;
}
cli_name[num-1]='\0';
printf("client's name is %s.\n",cli_name);
while (num=recv(connectfd,recvbuf,MAXDATASIZE,0)) {
printf("received client(%s) message:%s",cli_name,recvbuf);
if ((fp=fopen(recvbuf,"r" )==NULL){
strcpy(sendbuf,"not exit" ;
send(connectfd,sendbuf,strlen(sendbuf),0);
exit (1);
}
if (fgets(ch,1000,fp)==EOF)
perror("fgets error" ;
while (*ch!=EOF) {
memcpy(sendbuf,&ch,sizeof(ch));
send(connectfd,sendbuf,strlen(sendbuf),0);
fgets(ch,1000,fp);
}
close(fp);
}
close(connectfd);
}
void sig_handler(int s)
{
pid_t pid;
int stat;
while (( pid=waitpid(-1,&stat,WNOHANG))>;0)
printf("child %d terminated\n",pid);
return;
}
|
|