1

似乎当我像这样使用 send() 函数(在 TCP 文件传输程序中)时

while((count = recv(socketConnection, buff, 100000, 0))>0)
myfile.write(buff,count);

函数 recv() 只是等到整个数据到来并退出循环,此时它不再接收任何数据,而是在类似的 UDP 程序程序中

while((n = recvfrom(sockfd,mesg,1024,0,(struct sockaddr *)&cliaddr,&len))>0)
myfile.write(mesg,n);

recvfrom() 函数只是阻塞并且由于某种原因没有退出循环,据我所知 recv() 和 recvfrom() 都阻塞了?那为什么不一样。它与功能有关还是与 TCP、UDP 的性质有关(我猜这不是原因)?

PS请帮助我理解这些家伙,我是套接字编程和网络的新手。编辑:TCP 和 UDP UDP 服务器的完整服务器程序(使用 recvfrom() )

 int i=0;
   int sockfd,n;
   struct sockaddr_in servaddr,cliaddr;
   socklen_t len;
   char mesg[1024];
   sockfd=socket(AF_INET,SOCK_DGRAM,0);
   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port=htons(32000);
   bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
   ofstream myfile;
  // fcntl(sockfd,F_SETFL,O_NONBLOCK);
   myfile.open("2gb",ios::out);

    while((n = recvfrom(sockfd,mesg,1024,0,(struct sockaddr *)&cliaddr,&len))>0)
    myfile.write(mesg,n);

TCP (recv() ) 服务器程序

    struct sockaddr_in socketInfo;
   char sysHost[MAXHOSTNAME+1];  // Hostname of this computer we are running on
   struct hostent *hPtr;
   int socketHandle;
   int portNumber = 8070;
   //queue<char*> my_queue;
   bzero(&socketInfo, sizeof(sockaddr_in));  // Clear structure memory
   gethostname(sysHost, MAXHOSTNAME);  // Get the name of this computer we are running on
   if((hPtr = gethostbyname(sysHost)) == NULL)
   {
      cerr << "System hostname misconfigured." << endl;
      exit(EXIT_FAILURE);
   }
   if((socketHandle = socket(AF_INET, SOCK_STREAM, 0)) < 0)
   {
      close(socketHandle);
      exit(EXIT_FAILURE);
   }
  // std::cout<<"hi starting server";
   socklen_t optlen;
   int rcvbuff=262144;
  optlen = sizeof(rcvbuff);
   socketInfo.sin_family = AF_INET;
   socketInfo.sin_addr.s_addr = htonl(INADDR_ANY); 
   socketInfo.sin_port = htons(portNumber);      // Set port number
   if( bind(socketHandle, (struct sockaddr *) &socketInfo, sizeof(socketInfo)) < 0)
   {
      close(socketHandle);
      perror("bind");
      exit(EXIT_FAILURE);
   }
   listen(socketHandle, 1);
   int socketConnection;
   if( (socketConnection = accept(socketHandle, NULL, NULL)) < 0)
   {
      exit(EXIT_FAILURE);
   }
   close(socketHandle);
time_start(boost::posix_time::microsec_clock::local_time());
   int rc = 0;  // Actual number of bytes read
   int count=0;
   char *buff;
   int a=100000;
   buff=new char[a];


   ofstream myfile;
   myfile.open("345kb.doc",ios::out|ios::app);
   if(myfile.is_open())
   {
    long i=0;
   while((count = recv(socketConnection, buff, 100000, 0))>0)
   {


    myfile.write(buff,count);

    }}
4

2 回答 2

3

函数 recv() 只是等到整个数据到来并在不再接收任何数据时退出循环

recv()当发送方关闭连接时,在 TCP 连接上返回 0,这是您的循环终止的条件。

对于 UDP 程序,recvfrom() 函数只是阻塞并且由于某种原因不会退出循环,

recv()因为 UDP 是一种无连接协议,因此对于关闭的 UDP 连接没有特殊的返回码。除非有人给你发送一个长度为 0 的数据报。

于 2013-07-15T14:11:11.100 回答
1

recv() 将结束循环,因为在另一端套接字已关闭,因此 recv() 将返回 0(套接字正常关闭),而 recvfrom 没有该信号,它不知道关闭,因为它是未连接的插座。它一直呆在那里,直到它收到一个数据包或超时,使用 UDP 你需要一种方法来告诉通信已经结束(完成)。

于 2013-07-15T14:12:37.310 回答