- 论坛徽章:
- 0
|
//Client.c//
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<error.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<netdb.h>
#define server_port 1234
#define MAXDATASIZE 2048
int main(int argc, char *argv[]) {
FILE *fd;
int sockfd,recvbytes,sendbytes,writebytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if(argc != 4) {
fprintf(stderr,"client [-t] hostname files \n\t [-s] hostname message_info \n");
exit(1);
}
if((host = gethostbyname(argv[2])) ==NULL) {
perror("gethostbyname");
exit(1);
}
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
perror("socket faild");
exit(1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(server_port);
serv_addr.sin_addr= *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
printf("connect readly\n");
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
perror("connect faild");
exit(1);
}
printf("connect success!\n");
switch(argv[1][1])
{
case 't' :
if((sendbytes = send(sockfd,"t",2,0)) == -1) {
perror("send faild ");
exit(1);
}
sleep(10);
if((sendbytes = send(sockfd,argv[3],strlen(argv[3]),0)) == -1) {
perror("send faild ");
exit(1);
}
if((fd=fopen(argv[3],"w")) != NULL)
{
sleep(10);
if(recvbytes = recv(sockfd,buf,MAXDATASIZE,0) ==-1) {
perror("recvfrom faild");
exit(1);
}
printf("recv success!");
if((writebytes = fwrite(buf,sizeof(char),recvbytes,fd)) < 0) {
perror("write faild");
exit(1);
}
printf("files download success,files size:%dB\n",writebytes);
}
fclose(fd);
break;
case 's':
if((sendbytes = send(sockfd,argv[3],MAXDATASIZE,0)) == -1) {
perror("send faild");
exit(1);
}
printf("message: %s\n",argv[3]);
break;
default:
exit(1);
}
close(sockfd);
}
***************************************************
//server.c//
#include<stdio.h>
#include<stdlib.h>
#include<sys/file.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<error.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#define server_port 1234
#define MAXDATASIZE 2048
#define BACKLOG 10
#define MAXFILE 65535
int main(){
int fd;
int sockfd,client_fd;
struct sockaddr_in server_sockaddr,client_sockaddr;
int n=0,sin_size,recvbytes,sendbytes;
char c,buf[MAXDATASIZE];
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
perror("socket faild!");
exit(1);
}
printf("socket success! sockfd %d\n",sockfd);
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(server_port);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero),0);
if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) == -1) {
perror("bind faild!");
exit(1);
}
printf("bind success!\n");
if(listen(sockfd,BACKLOG) == -1) {
perror("listen faild!");
exit(1);
}
printf("Listen........!\n");
if((client_fd = accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size)) == -1) {
perror("accept faild!");
exit(1);
}
if((recvbytes = recv(client_fd,buf,MAXDATASIZE,0)) == -1)
{
perror("recv");
exit(1);
}
if((strcmp(buf,"t")) == 0)
{
memset(buf,0,sizeof(buf));
if( recv(client_fd,buf,MAXDATASIZE,0) == -1) {
perror("recv faild");
exit(1);
}
printf("buf : %s\n",buf);
if((fd=open(buf,O_RDONLY)) < 0) {
perror("fopen faild!");
exit(1);
}
printf("file : %s is existing! number: %d\n",buf,fd);
memset(buf,0,sizeof(buf));
/*while((c=fgetc(fd)) != EOF || n <= MAXDATASIZE )
{
buf[n] = c;
n++;
}a
if((sendbytes = send(sockfd,buf,MAXDATASIZE,0)) == -1) {
perror("send faild");
exit(1);
}*/
if((c =read(fd,buf,MAXDATASIZE)) == -1) {
perror("read faild");
exit(1);
}
printf("read success !\n");
//printf("buf: %s\n",buf); ok
if((sendbytes = send(sockfd,buf,c,0)) == -1){
perror("send faild");
exit(1);
}
printf("file send success!\n");
close(fd);
}
else
printf("message: %s\n",buf);
close(sockfd);
}
问题出现在server端能读取client -t ip filenames 端要得文件,但是发送却不成功且无任何信息提示。程序中对文件内容发送做了一个判断,发送不成功报错,并退出程序。如果成功则打印file send success!
可这些都没有提示。
更奇怪的是client竟然能接受server发来的信息并且写文件成功,可文件内容是乱码,小弟是刚学socket,还请高手指教阿! |
|