+ -
当前位置:首页 → 问答吧 → 怎么通过socket在客户端与服务器之间传文件(比如一个C文件)

怎么通过socket在客户端与服务器之间传文件(比如一个C文件)

时间:2010-08-24

来源:互联网

小弟刚学习socket通信,只知道一些皮毛,附上两段程序(server.c和client.c)
server.c
------------
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <netinet/in.h>
  9. #define SERVPORT 3333
  10. #define BACKLOG 10
  11. #define MAX_CONNECTED_NO 10
  12. #define MAXDATASIZE 10
  13. int main()
  14. {
  15.   struct sockaddr_in server_sockaddr,client_sockaddr;
  16.   int sin_size,recvbytes;
  17.   int sockfd,client_fd;
  18.   int i;
  19.   char buf[MAXDATASIZE];
  20. /**********************创建一个socket*******************/
  21.   if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
  22.     {
  23.       perror("socket");
  24.       exit(1);
  25.     }
  26.   printf("socket success!,sockfd=%d\n",sockfd);
  27. /*******************************************************/  
  28.   server_sockaddr.sin_family=AF_INET;
  29.   server_sockaddr.sin_port=htons(SERVPORT);
  30.   server_sockaddr.sin_addr.s_addr=INADDR_ANY;
  31.   bzero(&(server_sockaddr.sin_zero),8);
  32. /**********************bind端口*************************/  
  33.   if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) == -1)
  34.     {
  35.       perror("bind");
  36.       exit(1);
  37.     }
  38.   printf("bind success!\n");
  39. /*******************************************************/
  40. /************************监听***************************/
  41.   if(listen(sockfd,BACKLOG) == -1)
  42.     {
  43.       perror("listen");
  44.       exit(1);
  45.     }
  46.   printf("listening....\n");
  47. /*******************************************************/

  48.   if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size)) == -1)
  49.             {
  50.               perror("accept");
  51.               exit(1);
  52.             }  
  53.   
  54.   if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0)) == -1)
  55.             {
  56.               perror("recv");
  57.               exit(1);
  58.             }
  59.   printf("received a connection :%s\n",buf);
  60.   

  61.   close(sockfd);
  62. }
复制代码
-----------------------------------------------------------------------------------------------------------------
client.c
---------
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. #include<netdb.h>
  6. #include<sys/types.h>
  7. #include<netinet/in.h>
  8. #include<sys/socket.h>
  9. #define SERVPORT 3333
  10. #define MAXDATASIZE 100
  11. void main(int argc,char *argv[])
  12. {
  13.   int sockfd,sendbytes;
  14.   char buf[MAXDATASIZE];
  15.   struct hostent *host;
  16.   struct sockaddr_in serv_addr;
  17.   if(argc < 2)
  18.     {
  19.       fprintf(stderr,"Please enter the server's hostname!\n");
  20.       exit(1);
  21.     }

  22.   if((host=gethostbyname(argv[1])) == NULL)
  23.     {
  24.       perror("gethostbyname error!");
  25.       exit(1);
  26.     }

  27.   if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
  28.     {
  29.       perror("socket");
  30.       exit(1);
  31.     }

  32.   serv_addr.sin_family=AF_INET;
  33.   serv_addr.sin_port=htons(SERVPORT);
  34.   serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
  35.   bzero(&(serv_addr.sin_zero),8);

  36.   if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
  37.     {
  38.       perror("connect");
  39.       exit(1);
  40.     }

  41.   if((sendbytes=send(sockfd,"hello",5,0)) == -1)
  42.     {
  43.       perror("send");
  44.       exit(1);
  45.     }
  46.   close(sockfd);
  47. }
复制代码
-------------------------------------------------------------------------------------------------------
这两段程序的目的是客户端发一个“hello”给服务器,然后服务器把它显示出来!
假设编译后的可执行文件为server和client
在Linux下启动两个shell,先在一个shell下运行server.c:
./server
然后在另一个shell下运行client.c:
./client 127.0.0.1(这里利用环回地址)
-------------------------------------------------------------------------------------------------------
看一下输出:
服务器端:
socket success!,sockfd=3
bind success!
listening....
received a connection :helloP
这里有个问题,为什么会输出“helloP”

重点:怎么在上述的程序上进行修改,使得客户端可以发一个C文件到服务器端!
谢谢!

作者: zhuqing_739   发布时间: 2010-08-24

Server :
char buf[MAXDATASIZE] = {0,};

Client:
char *s = "hello\n";
send (sockfd, s, strlen(s) 0);
或者
sizeof()

作者: fanronghua   发布时间: 2010-08-24