当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]关于socket编程
帖子发表于 : 2008-09-07 17:53 

注册: 2008-03-18 13:23
帖子: 26
送出感谢: 0 次
接收感谢: 0 次
自己写的关于rls的代码,实现远程ls命令
但是发现服务器程序在c=fgetc(fp)得到需要的内容时是正确的,但是在发送到客户端的时候客户端却收不到
messlen=read(sock_id,buf,BUFSIZ)中messlen一直等于0
已发现是服务器程序的问题
把fclose(fin);fclose(fout);的顺序交换一下就可以,现在搞不懂的是为什么这两个的顺序会有影响呢?都已经出while循环了啊。


# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>

# define PORT 1300
# define HOSTLEN 256
# define oops(msg) { perror(msg);exit(1); }

int main()
{
struct sockaddr_in saddr;
char hostname[HOSTLEN];
int sock_id,sock_fd;
struct hostent *hp;
FILE *fout,*fin,*fp;
char dirname[BUFSIZ];
char command[BUFSIZ];
char c;

sock_id=socket(PF_INET,SOCK_STREAM,0);
if(sock_id==-1)
oops("socket");

bzero((void *)&saddr,sizeof(saddr));
gethostname(hostname,HOSTLEN);
hp=gethostbyname(hostname);
bcopy((void *)hp->h_addr,(void *)&saddr.sin_addr,hp->h_length);
saddr.sin_port=htons(PORT);
saddr.sin_family=AF_INET;
if(bind(sock_id,(struct sockaddr *)&saddr,sizeof(saddr))!=0)
oops("bind");
if(listen(sock_id,1)!=0)
oops("listen");

while(1){
sock_fd=accept(sock_id,NULL,NULL);
if(sock_fd==-1)
oops("accept");
fin=fdopen(sock_fd,"r");
if(fin==NULL)
oops("fdopen reading");
if(fgets(dirname,BUFSIZ-5,fin)==NULL)
oops("dirname reading");
sanitize(dirname);
sprintf(command,"ls % s",dirname);
fp=popen(command,"r");

if(fp==NULL)
oops("popen");
fout=fdopen(sock_fd,"w");
if(fout==NULL)
oops("fdopen writing");
while((c=fgetc(fp))!=EOF)
fputc(c,fout);

pclose(fp);
fclose(fin);
fclose(fout);
}


return 0;
}

sanitize(char *str)
{
char *src, *dest;

for ( src = dest = str ; *src ; src++ )
if ( *src == '/' || isalnum(*src) )
*dest++ = *src;
*dest = '\0';
}


最后由 Einsxu 编辑于 2008-09-07 19:21,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-09-07 17:54 

注册: 2008-03-18 13:23
帖子: 26
送出感谢: 0 次
接收感谢: 0 次
客户端程序如下
# include <stdio.h>
# include <stdlib.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>
# include <string.h>

# define oops(msg) { perror(msg);exit(1);}
# define PORT 1300

int main(int argc,char *argv[])
{
struct sockaddr_in servadd;
struct hostent *hp;
int sock_id,sock_fd;
int messlen;
char buf[BUFSIZ];

if(argc!=3)
oops("please input the write command");
sock_id=socket(AF_INET,SOCK_STREAM,0);
if(sock_id==-1)
oops("socket");

bzero(&servadd,sizeof(servadd));
hp=gethostbyname(argv[1]);
if(hp==NULL)
oops("argv[1]");
bcopy((void *)hp->h_addr,(void *)&servadd.sin_addr,hp->h_length);
servadd.sin_port=htons(PORT);
servadd.sin_family=AF_INET;
if(connect(sock_id,(struct sockaddr *)&servadd,sizeof(servadd))!=0)
oops("connect");

messlen=write(sock_id,argv[2],strlen(argv[2]));
if(messlen==-1)
oops("write dirname");
if(write(sock_id,"\n",1)==-1)
oops("write \n");
while((messlen=read(sock_id,buf,BUFSIZ))>0)
if(write(1,buf,messlen)!=messlen)
oops("write");

printf("messlen=%d\n",messlen);
close(sock_id);

return 0;
}

在自己机器上使用的命令是./rls a-desktop /media


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译