一個select服務的檔案傳輸

來源:互聯網
上載者:User

//伺服器的代碼  只能傳輸文字檔

#include <WinSock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")
#define FILEFROMADDR "F://521.jpg"
void main()
{

 WORD wVersionRequested;
 WSADATA wsaData;
 int err;

 wVersionRequested = MAKEWORD( 2, 2 );

 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
   return;
 }

 if ( LOBYTE( wsaData.wVersion ) != 2 ||
  HIBYTE( wsaData.wVersion ) != 2 ) {
   WSACleanup( );
   return;
  }

  SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.s_addr = INADDR_ANY;
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(6000);
  
  int iResult;
  iResult=bind(sockServer,(SOCKADDR*)&addrSrv,sizeof(addrSrv));
  if (SOCKET_ERROR==iResult)
  {
   printf("failed to bind/n");
   WSACleanup();
   return;
  }

  SOCKET sockAccept;
  SOCKADDR_IN addrAccept;
  int iAcceptlen=sizeof(addrAccept);
  listen(sockServer,5);
  
  fd_set socketSet;
  fd_set readSet;
        FD_ZERO(&socketSet);
  FD_SET(sockServer,&socketSet);
  printf("wait for start server.......");

  while(true)
  {
   fd_set readSet=socketSet;
   select(NULL,&readSet,NULL,NULL,NULL);
   for (int i=0;i < socketSet.fd_count;i++)
   {
    if (FD_ISSET(socketSet.fd_array[i],&readSet))
    {
     if (socketSet.fd_array[i] == sockServer)
     {
      sockAccept=accept(sockServer,(SOCKADDR*)&addrAccept,&iAcceptlen);
     
      FD_SET(sockAccept,&socketSet);
                        printf("%s have connect server/n",inet_ntoa(addrAccept.sin_addr));
                       
     }
     else
     {
                        FILE *sendFile;
      char sendBuf[100];
      char recvBuf[100];
      memset(sendBuf,0,100);
                        sendFile = fopen(FILEFROMADDR,"rb");
      if (NULL == sendFile)
      {
       printf("Can not open the file /n");
       return;
      }
      if(!feof(sendFile))
      {
       int readLen = fread(sendBuf,1,100,sendFile);
       int iSendSize=send(socketSet.fd_array[i],sendBuf,readLen,0);
       printf("%d/n",sendBuf);
       memset(sendBuf,0,100);
       if (SOCKET_ERROR == iSendSize)
       {
        closesocket(socketSet.fd_array[i]);
        FD_CLR(socketSet.fd_array[i],&socketSet);
        i--;
       }
       if (0 == iSendSize)
       {
        //客戶socket關閉
        printf("%s:%d has closed!/r/n",inet_ntoa(addrAccept.sin_addr),
           ntohs(addrAccept.sin_port));

        closesocket(socketSet.fd_array[i]);
        FD_CLR(socketSet.fd_array[i],&socketSet);
        i--; 
       }
      }
      fclose(sendFile);
     
     }
    }
     
    
   }

  }

 

}

 

//用戶端的代碼

#include <WinSock2.h>
#include <stdio.h>
#include <io.h>
#include <string>
#pragma  comment (lib,"ws2_32.lib")
#define  FILESAVEADDR "E://521.jpg"
void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;

 wVersionRequested = MAKEWORD( 2, 2 );

 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  
  return;
 }

 
 if ( LOBYTE( wsaData.wVersion ) != 2 ||
  HIBYTE( wsaData.wVersion ) != 2 )
 {
   
   WSACleanup( );
   return;
  }

 
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.s_addr=inet_addr("127.0.0.1");
  addrSrv.sin_family=AF_INET;
  addrSrv.sin_port=htons(6000);

  SOCKET clientSock=socket(AF_INET,SOCK_STREAM,0);
  int iResult;
  iResult=connect(clientSock,(SOCKADDR*)&addrSrv,sizeof(addrSrv));
  if (SOCKET_ERROR == iResult)
  {
   printf("Failed to connect server error is %d/r/n",WSAGetLastError());
   WSACleanup();
   return; 
  }

  if (0 != iResult)
  {
   int iErrorCode;
   iErrorCode = WSAGetLastError();
   printf("Failed to connect server,error:%d./r/n",iErrorCode);
   WSACleanup();
   return;
  }

 
 char recvBuf[100]="";//用來得到檔案的
 FILE *fileClient= fopen(FILESAVEADDR,"w+");
 
 send(clientSock,"dd",3,0);
 
 recv(clientSock,recvBuf,sizeof(recvBuf),0);
 printf("the length %d/n",strlen(recvBuf));
 printf("%s/n",recvBuf);
 fwrite(recvBuf,sizeof(char),strlen(recvBuf),fileClient);
 memset(recvBuf,0,100);

  
 printf("檔案已經下載完畢!下載的目錄位址為 %s/n",FILESAVEADDR);
 
 fclose(fileClient);

  
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.