Windows平台下的win socket网络编程-文件传输小范例:

Windows平台下的win socket网络编程-文件传输小范例:

实现:C语言

功能:文件传输(可以传任何格式的文件)

 //
 // FILENAME:
 //         File_Transfer_Server.c
 //
 // DESCRIPTION:
 //         Winsocket Server demo, receive filename from Client and transfer the file to Client.
 //
 // ORIGINAL DATE:
 //         07/06/2013
 //
 // PROTOCOL:
 //         TCP
 //
 // PLATFORM:
 //        Windows
 //

#include
#include
#include
#include

#define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")

int main()
{
 // 声明并初始化一个服务端(本地)的地址结构
 sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
 server_addr.sin_port = htons(PORT);

 // 初始化socket dll
 WSADATA wsaData;
    WORD socketVersion = MAKEWORD(2, 0);
 if(WSAStartup(socketVersion, &wsaData) != 0)
 {
  printf("Init socket dll error!");
  exit(1);
 }

 // 创建socket
 SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0);
    if (SOCKET_ERROR == m_Socket)
    {
  printf("Create Socket Error!");
  exit(1);
    }

 //绑定socket和服务端(本地)地址
 if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
 {
  printf("Server Bind Failed: %d", WSAGetLastError());
  exit(1);
 }

 //监听
 if (SOCKET_ERROR == listen(m_Socket, 10))
 {
  printf("Server Listen Failed: %d", WSAGetLastError());
  exit(1);
 }


 while(1)
 {
  printf("Listening To Client...\n");

  sockaddr_in client_addr;
  int client_addr_len = sizeof(client_addr);

  SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);
  if (SOCKET_ERROR == m_New_Socket)
  {
   printf("Server Accept Failed: %d", WSAGetLastError());
   break;
  }

        char buffer[BUFFER_SIZE];
        memset(buffer, 0, BUFFER_SIZE);
  if (recv(m_New_Socket, buffer, BUFFER_SIZE, 0) < 0)
  {
   printf("Server Receive Data Failed!");
   break;
  }

  char file_name[FILE_NAME_MAX_SIZE+1];
  memset(file_name, 0, FILE_NAME_MAX_SIZE+1);
  strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
        printf("%s\n", file_name);

  FILE * fp = fopen(file_name, "rb");  //windows下是"rb",表示打开一个只读的二进制文件
  if (NULL == fp)
  {
   printf("File: %s Not Found\n", file_name);
  }
        else
  {
   memset(buffer, 0, BUFFER_SIZE);
   int length = 0;

   while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
   {
    if (send(m_New_Socket, buffer, length, 0) < 0)
    {
     printf("Send File: %s Failed\n", file_name);
     break;
    }
    memset(buffer, 0, BUFFER_SIZE);
   }

   fclose(fp);
   printf("File: %s Transfer Successful!\n", file_name);
  }
  closesocket(m_New_Socket);
 }

 closesocket(m_Socket);
 //释放winsock库
 WSACleanup();
 return 0;

 

 

//
// FILENAME:
//         File_Transfer_Client.c
//
// DESCRIPTION:
//         Winsocket Server demo, receive filename from Client and transfer the file to Client.
//
// ORIGINAL DATE:
//         07/06/2013
//
// PROTOCOL:
//         TCP
//
// PLATFORM:
//         Windows
//

#include
#include
#include
#include

#define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")

int main()
{
 // 初始化socket dll
 WSADATA wsaData;
 WORD socketVersion = MAKEWORD(2, 0);
 if(WSAStartup(socketVersion, &wsaData) != 0)
 {
  printf("Init socket dll error!");
  exit(1);
 }

 //创建socket
 SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0);
 if (SOCKET_ERROR == c_Socket)
 {
  printf("Create Socket Error!");
  system("pause");
  exit(1);
 }

 //指定服务端的地址
 sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
 server_addr.sin_port = htons(PORT);

 if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
 {
  printf("Can Not Connect To Server IP!\n");
  system("pause");
  exit(1);
 }

 //输入文件名
    char file_name[FILE_NAME_MAX_SIZE+1];
 memset(file_name, 0, FILE_NAME_MAX_SIZE+1);
 printf("Please Input File Name On Server: ");
 scanf("%s", &file_name);

 char buffer[BUFFER_SIZE];
 memset(buffer, 0, BUFFER_SIZE);
 strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name));

 //向服务器发送文件名
 if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0)
 {
  printf("Send File Name Failed\n");
  system("pause");
  exit(1);
 }

 //打开文件,准备写入
 FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打开一个只写的二进制文件
 if(NULL == fp)
 {
  printf("File: %s Can Not Open To Write\n", file_name);
  system("pause");
  exit(1);
 }
 else
 {
  memset(buffer, 0, BUFFER_SIZE);
  int length = 0;
  while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0)
  {
   if (fwrite(buffer, sizeof(char), length, fp) < length)
   {
    printf("File: %s Write Failed\n", file_name);
    break;
   }
   memset(buffer, 0, BUFFER_SIZE);
  }

  printf("Receive File: %s From Server Successful!\n", file_name);
 }

 fclose(fp);
 closesocket(c_Socket);
 
 //释放winsock库
 WSACleanup();

 system("pause");
 return 0;

你可能感兴趣的:(soket,C/C++,C++)