日期:2014-05-16  浏览次数:20842 次

unix中简单的C/S文件通信
   服务器端代码:
   #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define TRUE 1                       /////////////
#define DataNum 126                  ////////////  有用的126字节
#define BUFSIZE 128                  ///////////// 每次发送128字节
/*发的时候是128,*/
main ()
{
   int sock,length,clilen;
   struct sockaddr_in server,client;
   int msgsock;

   /******************************建立Socket连接*********************************/
   sock=socket(AF_INET,SOCK_STREAM,0);    //申请socket资源  
   if (sock<0)
   {
 perror("opening stream socket");
 exit(1);
   }

   server.sin_family=AF_INET;
   server.sin_addr.s_addr=INADDR_ANY;  /*必然的,这里指的是Internet协议*/
   server.sin_port=0;/*这里,是让系统自动分配一个端口号,在1024到5000之间65535个端口 ,端口设为0,系统自动分配 */ 
   if (bind(sock,(struct sockaddr *)&server,sizeof server)<0) /*将IP地址和端口号绑到sock上 */
   {
 perror("binding stream socket");
 exit(1);
   }

   length=sizeof server;
   if (getsockname(sock,(struct sockaddr *)&server,&length)<0) /*获得指定socket的本地地址,成功返回0,错误返回-1*/
   {
 perror("getting socket name");
 exit(1);
   }
   printf("Socket port # %d\n",ntohs(server.sin_port)); /*                 打印出系统分的端口号,给client用*/

   listen(sock,5); /*5个连接请求排队等待,一般5个                     Pause Here    等待client连接*/

  /****************现在是等待客户来连接,如果来客户了,那就建好了socket,就可以当文件使用**********/
   do 
   {
    clilen=sizeof client;  
     msgsock=accept(sock,(struct sockaddr *)&client,(int *)  &clilen);/*创建一个新的与sock相同的socket并返回其值*/
 if (msgsock==-1)       /*非并发处理,反复型*/
perror("accept");
 else 
 { /**********这里开始进行文件处理,一直到最后************/
  int infile;
  ssize_t nread;
  char buf[BUFSIZE];
  int rval;
  int i=0;/*计数器*/
 
  if((infile=open("test.txt",O_RDONLY))==-1)             //只读方式打开test.txt  ,iffile文件指针
  {
printf("找不到文件test.txt或打不开,停止运行\n");
exit(1);
}
 
  memset(buf,0,sizeof buf);/*缓冲区清零*/
  while((nread=read(infile,buf,DataNum))>0) /*将文件读到缓冲区,     &