一个C程序问题``请各位帮我看下 100分送上`````````````在线等
这是socket服务端server.c的代码
怎样让里面printf的内容显示到客户端而不是服务端
#include <stdio.h>
#include <sys pes.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 1234
char login[] = "login.txt ";
char coursesInfo[] = "courses.txt ";
char materials[] = "materials.txt ";
char marks[] = "marks.txt ";
char id[6],cid[8],cname[8];
char sid[8],mname[8],size[5];
char buffer[256],name[255],password[255];
char filenameToSave[255];
bool isContinue=true;
void displayFile(char *fileName, char name[])
{
FILE * in;
in = fopen(fileName, "r ");
do{
fscanf (in, "%s%s%s ",id,cid,cname);
if (strcmp (name, id) == 0)
{
printf( "%s\t%s\t%s\n ", id,cid,cname);
}
}while(!(feof(in)));
fclose(in);
if(!sizeof(filenameToSave))
{
strcat(filenameToSave, " ");
strcat(filenameToSave,filename);
}
else
strcpy(filenameToSave,filename);
}
void displayMaterials(char *fileName, char cid2[])
{
FILE * in;
char *pline[100];
int select;
unsigned int IndexMate=0;
in = fopen(fileName, "r ");
do{
fscanf (in, "%s%s%s ", sid,mname,size);
if (strcmp (cid2, sid) == 0){
pline[IndexMate]=(char *)malloc(256);
sprintf(pline[IndexMate], "%s\t%s\t%s ",sid,mname,size);
printf( "%d: %s\t%s\t%s\n ",IndexMate+1,sid,mname,size);
IndexMate++;
}
printf( "\n\n ");
scanf( "%d ", &select);
if (select == 0){
system( "cls ");
break;
}
else if(select> 0&&select <=IndexMate){
printf( "Downloading : %s ",pline[select-1]);
printf( " Successful!\n ");
system( "pause ");
system( "cls ");
break;
}
else{
printf( "Invalid selection,please try again!\n ");
continue;
}
int i;
for( i=0;i <IndexMate-1;i++){
free(pline[i]);
}
}while(!(feof(in)));
fclose(in);
if(!sizeof(filenameToSave))
{
strcat(filenameToSave, " ");
strcat(filenameToSave,filename);
}
else
strcpy(filenameToSave,filename);
}
void menu()
{
printf( "\n\n ");
printf( "Welcome to SCD system!\n ");
printf( "\n\n ");
printf( "You can select following options:\n ");
printf( "1. Course Information\n ");
printf( "2. Course Materials\n ");
printf( "3. Course Result\n ");
printf( "4. Logout\n ");
}
void Work(char* buff)
{
if (strcmp(buff, "CLR ") )
{
printf( "Course Information:\n ");
displayFile(coursesInfo,name);
printf( "\n ");
}
else if (strcmp(buff, "CMR "))
{
char cid2[8];
printf( "Enter course id: ");
scanf( "%s ", cid2);
printf( "Course Materials:\n ");
displayMaterials(materials,cid2);
printf( "\n ");
}
else if (strcmp(buff, "AMR "))
{
printf( "Course Result:\n ");
displayFile(marks,name);
printf( "\n ");
}
else if(strcmp(buff, "L "))
{
printf( "exit!\n ");
strcpy(buffer, "exit ");
isContinue=false;
}else{
printf( "invalad choice! ");
}
}
void error(char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno, clilen;
struct sockaddr_in serv_addr, cli_addr;
int n;
FILE * in;
char temp[256];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error( "ERROR opening socket ");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(PORT);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error( "ERROR on binding ");
while(1)
{
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error( "ERROR on accept ");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0)
error( "ERROR reading from socket ");
///////////name
in = fopen(login, "r ");
while (fscanf(in, "%s %s ", name, password)!=EOF)
{
if (strcmp(buffer, name))
{
n = write(newsockfd, "validname ",18);
if (n < 0) error( "ERROR writing to socket ");
else{
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0)
error( "ERROR reading from socket ");
else{
if (strcmp(buffer, password)==0)
{
n = write(newsockfd, "validpassword ",18);
if (n < 0) error( "ERROR writing to socket ");
else{
while(isContinue)// 用户循环选择
{
menu();
bzero(buffer,256);
n = read(newsockfd,buffer,255);
strcpy(temp,buffer);
Work(temp);
}
strcpy(buffer,filenameToSave);
n = write(newsockfd,buffer,256);
}
}
else{
printf( "name wrong ");
}
}
}
}
else
{
printf( "name wrong ");
}
}
fclose(in);
}
return 0;
}
[解决办法]
怎样让里面printf的内容显示到客户端而不是服务端?
哥们,醒醒.我认为这不是不可能,但是超级复杂!
首先,printf是个系统函数,除非你重新实现,不然不可能.
如果重新实现,你也得把要打印的数据发送到client端再由client端处理.
[解决办法]
把要显示的数据发到客户端,
客户端接收到就显示
[解决办法]
客户端和服务器端定义一个接收协议,将所有printf函数全部改为发送函数,发送数据到客户端.客户端接收后显示.
[解决办法]
把printf 的内容已sprintf为字符串的格式发送到client端
在client在用printf显示
[解决办法]
没有什么不可以...
用重定向可以办到...偶好像在哪本书上看到过...
以上意见仅供参考...
------解决方案--------------------
taoyanqq() 和楼主都是我``呵呵```所以大家不要看错哈
======================================================
我还是运行错误```
socket 客户端错误提示:
?client.c:120: error: incompatible types in assignment
1client.c:121: error: incompatible type for
argument 1 of 鈥榝printf鈥
?client.c:122: error: incompatible type for argument 1 of 鈥榝close鈥
代码:(最后3行)strcpy(outputTofile, "logout_time: ");
time(&now);
strcat(outputTofile,(char*)now);
strcat(outputTofile,buffer);
file=fopen( "log.txt ", "w ");
fprintf(file, "%s ",buffer);
fclose(file);
}
怎么回事呀````````
[解决办法]
要说起来可能太复杂.小生只说个大概思路仅供楼主参考...
1.一般情况下我们的CMD窗口可使用的输入输出句柄为stdin,stderr,stdout,...其中前两者表示输入.后者表示输出.但它们的输入输出的目的地都是指CMD窗口.这里其实只要重定向CMD窗口的数据流不就行了么?重定向方法上面说过了.详细点就是下面这个样子:
PROCESS_INFOMATION Processinformation;
STARUPINF si;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
CreateProcess(NULL, "cmd.exe /k ", NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation);
注意,上面的hReadPipe2,hWritePipe1是管道的句柄.管道是一种内存间通信机制.起到共享内存的作用.一个进程向管理写入数据后别一个进程就可以从管道的另一端读出来.这个很好理解.
其实就是把原来输入到CMD窗口的内容输出到管道里再送到另一端的屏幕上.把屏幕上的内容也输出到管理里返回给客户端...
管道创建函数CreatePipe可查MSDN...
ZeroMEmory(&si,sizeof(si));