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

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) /*将文件读到缓冲区, 每次读126字节 */
{
printf("从文件中读了大小为 %d 的数据\n",nread);
buf[DataNum]=nread; /*把实际信息多少的数字放在发的数据后*/
i++;
buf[DataNum+1]=(i%10)+48;/*i+48是i的ASCII值*/
if(write(msgsock,buf,BUFSIZE)<=nread) /*将缓冲区的内容写到msgsock*/
printf("写sock出了错\n");
else
printf("往sock发了第 %d 块,大小是 %d \n",i,nread);

memset(buf,0,sizeof buf);/*缓冲区清零*/

if(rval=read(msgsock,buf,BUFSIZE)<0) /*从sock读对方收到信息后的应答 */  
printf("读sock出了错\n");
else
printf("对方收到块编号 %s \n\n",buf);
}/*while*/
close(infile);
   
  buf[DataNum]=0;/*和那边商量好了,如果这里为0表示文件发完了.*/
  if(write(msgsock,buf,BUFSIZE)<=nread)/*将缓冲区的内容写到sock*/
printf("写msgsock出了错\n");  
   
}
close(msgsock);/*关闭临时套节字,内核试图发送已在队列的所有数据*/  
   
  }while(TRUE);
  exit(0);
  }

  客户端代码:
   
  #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>