TCP/IP协议_职场#include "TFTPClient.h"
TCP/IP协议_职场
TCP/IP协议_职场int main(int argc, char** argv)
TCP/IP协议_职场{
TCP/IP协议_职场    /*argc = 4;
TCP/IP协议_职场    argv[1] = "222.205.41.160";
TCP/IP协议_职场    argv[2] = "GET";
TCP/IP协议_职场    argv[3] = "bb.txt";*/

TCP/IP协议_职场    /*argc = 5;
TCP/IP协议_职场    argv[1] = "-i";
TCP/IP协议_职场    argv[2] = "222.205.41.160";
TCP/IP协议_职场    argv[3] = "GET";
TCP/IP协议_职场    argv[4] = "Cantor.zip";*/

TCP/IP协议_职场    //freopen("out.txt", "w", stdout);
TCP/IP协议_职场    if(argc < 4)
TCP/IP协议_职场    {
TCP/IP协议_职场  help();
TCP/IP协议_职场  exit(1);
TCP/IP协议_职场    }
TCP/IP协议_职场    parseCmd(argc, argv);//Parse the command line commands
TCP/IP协议_职场
TCP/IP协议_职场    SOCKET sock = initWinsock();
TCP/IP协议_职场    sockaddr_in servAddr;
TCP/IP协议_职场    servAddr.sin_family = AF_INET;
TCP/IP协议_职场    servAddr.sin_port = htons(SERV_PORT);
TCP/IP协议_职场    servAddr.sin_addr.s_addr = cmd.hostaddr;
TCP/IP协议_职场    char buf[MAX_BUF];
TCP/IP协议_职场    int startTime = int(GetTickCount());
TCP/IP协议_职场    fileSize = 0;
TCP/IP协议_职场
TCP/IP协议_职场    if(cmd.put == 1)
TCP/IP协议_职场    {
TCP/IP协议_职场  //Begin initialize the WRQ packet
TCP/IP协议_职场  WRQNode node;
TCP/IP协议_职场  memset(&node, 0, sizeof(node));
TCP/IP协议_职场  strcpy(node.fileName, cmd.fileName.c_str());
TCP/IP协议_职场  node.opCode = 2;
TCP/IP协议_职场  if(cmd.binFlag == 0)
TCP/IP协议_职场      strcpy(node.mode, "netascii");
TCP/IP协议_职场  else
TCP/IP协议_职场  if(cmd.binFlag == 1)
TCP/IP协议_职场      strcpy(node.mode, "octet");
TCP/IP协议_职场  //End initialize the WRQ packet
TCP/IP协议_职场
TCP/IP协议_职场  //Begin sending the WRQ packet
TCP/IP协议_职场  sockaddr_in addr;
TCP/IP协议_职场  int len = sizeof(addr);
TCP/IP协议_职场  ACKNode ackNode;
TCP/IP协议_职场  do
TCP/IP协议_职场  {
TCP/IP协议_职场      int size = makeWRQ(node, buf, sizeof(buf));
TCP/IP协议_职场      if(sendto(sock, buf, size, 0, (sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
TCP/IP协议_职场      {
TCP/IP协议_职场    cerr << "Error at sendto(): " << WSAGetLastError() << endl;
TCP/IP协议_职场    WSACleanup();
TCP/IP协议_职场    return 1;
TCP/IP协议_职场      }
TCP/IP协议_职场      memset(buf, 0, sizeof(buf));
TCP/IP协议_职场      int ret = recvfrom(sock, buf, sizeof(buf), 0, (sockaddr*)&addr, &len);
TCP/IP协议_职场      if(ret == SOCKET_ERROR)
TCP/IP协议_职场      {
TCP/IP协议_职场    cerr << "Error at recvfrom(): " << WSAGetLastError() << endl;
TCP/IP协议_职场    WSACleanup();
TCP/IP协议_职场    return 1;
TCP/IP协议_职场      }
TCP/IP协议_职场      if (getOp(buf) == ERR)
TCP/IP协议_职场      {
TCP/IP协议_职场    ERRNode errNode;
TCP/IP协议_职场    parseERR(buf, errNode);
TCP/IP协议_职场    cout << "Error: " << errNode.errMsg << endl;
TCP/IP协议_职场    return 1;
TCP/IP协议_职场      }
TCP/IP协议_职场      else
TCP/IP协议_职场    parseACK(buf, ackNode);
TCP/IP协议_职场  }while(ackNode.opCode != 4 || ackNode.blockNumber != 0);
TCP/IP协议_职场  //End sending the WRQ packet and received the ACK packet successfully
TCP/IP协议_职场  
TCP/IP协议_职场  //Begin sending the file
TCP/IP协议_职场  if(sendFile(sock, (sockaddr*)&addr))
TCP/IP协议_职场  {
TCP/IP协议_职场      int endTime = int(GetTickCount());
TCP/IP协议_职场      printInfo(cmd.fileName.c_str(), endTime - startTime, fileSize);
TCP/IP协议_职场  }
TCP/IP协议_职场  //End sending the file and successfully received last ACK packet
TCP/IP协议_职场
TCP/IP协议_职场  //Close the connection
TCP/IP协议_职场  closesocket(sock);
TCP/IP协议_职场  WSACleanup();
TCP/IP协议_职场  return 0;
TCP/IP协议_职场    }
TCP/IP协议_职场    else
TCP/IP协议_职场    if(cmd.get == 1)
TCP/IP协议_职场    {
TCP/IP协议_职场  //Begin initialize the RRQNode
TCP/IP协议_职场  RRQNode rrqNode;
TCP/IP协议_职场  memset(&rrqNode, 0, sizeof(rrqNode));
TCP/IP协议_职场  rrqNode.opCode = 1;
TCP/IP协议_职场  strcpy(rrqNode.fileName, cmd.fileName.c_str());
TCP/IP协议_职场  if(cmd.binFlag == 0)
TCP/IP协议_职场      strcpy(rrqNode.mode, "netascii");
TCP/IP协议_职场  else
TCP/IP协议_职场  if(cmd.binFlag == 1)
TCP/IP协议_职场      strcpy(rrqNode.mode, "octet");
TCP/IP协议_职场  //End initialize the RRQNode
TCP/IP协议_职场
TCP/IP协议_职场  //Begin send the RRQNode
TCP/IP协议_职场  int ret = makeRRQ(rrqNode, buf, sizeof(buf));
TCP/IP协议_职场  if(sendto(sock, buf, ret, 0, (sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
TCP/IP协议_职场  {
TCP/IP协议_职场      cout << "Error at sendto(): " << WSAGetLastError() << endl;
TCP/IP协议_职场      WSACleanup();
TCP/IP协议_职场      return 1;
TCP/IP协议_职场  }
TCP/IP协议_职场  //End send the RRQNode
TCP/IP协议_职场
TCP/IP协议_职场  //Begin receive the file
TCP/IP协议_职场  if(recvFile(sock))
TCP/IP协议_职场  {
TCP/IP协议_职场      int endTime = int(GetTickCount());
TCP/IP协议_职场      printInfo(cmd.fileName.c_str(), endTime - startTime, fileSize);
TCP/IP协议_职场  }
TCP/IP协议_职场  //End receive the file
TCP/IP协议_职场
TCP/IP协议_职场  //Close the connection
TCP/IP协议_职场  closesocket(sock);
TCP/IP协议_职场  WSACleanup();
TCP/IP协议_职场  return 0;
TCP/IP协议_职场    }
TCP/IP协议_职场    return 0;
TCP/IP协议_职场}