我在作socket接受数据编程,有一个疑问一直困惑着我:
if(num=recv(sockfd,&sRevbuf,length,0))==-1)
如果socket异常出错是返回-1,那如果socket是正常的关闭,或者回话是正常的关闭,是不是也返回-1。随便还有一个问题关于memcpy(&des[(i-1)*1024],&suc,1024),如果des初始化是char des[1024*300],但是i如果取的超过了300,其实是溢出,这样程序执行到这里会中断呢,还是就会越界拷贝在一块未知的区域呢?

解决方案 »

  1.   

    1仍然是返回-1,具体的可以用GetLastErr这样的函数来获取啦
      

  2.   

    Return Values
    If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
      

  3.   

    如果安装了platformsdk2003R2,在这里有说明ms-help://MS.PSDKSVR2003R2.1033/winsock/winsock/recv_2.htm
      

  4.   

    能不能举个例子,比如我回话关闭了,还能返回0的!我觉得以为recv和send都是对缓存区操作的,其实和回话应该没有多大关系
      

  5.   

    ms-help://MS.PSDKSVR2003R2.1033/winsock/winsock/recv_2.htm#include <stdio.h>
    #include "winsock2.h"void main() {
      //----------------------
      // Initialize Winsock
      WSADATA wsaData;
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
      if (iResult != NO_ERROR)
        printf("Error at WSAStartup()\n");  //----------------------
      // Create a SOCKET for connecting to server
      SOCKET ConnectSocket;
      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return;
      }  //----------------------
      // The sockaddr_in structure specifies the address family,
      // IP address, and port of the server to be connected to.
      sockaddr_in clientService; 
      clientService.sin_family = AF_INET;
      clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
      clientService.sin_port = htons( 27015 );  //----------------------
      // Connect to server.
      if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
      }  //----------------------
      // Declare and initialize variables.
      int bytesSent;
      int bytesRecv = 0;
      char sendbuf[32] = "Client: Sending data.";
      char recvbuf[32] = "";  //----------------------
      // Send and receive data.
      bytesSent = send( ConnectSocket, sendbuf, strlen(sendbuf), 0 );
      printf( "Bytes Sent: %ld\n", bytesSent );  while( bytesRecv != SOCKET_ERROR ) {
        bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 );
        if ( bytesRecv == 0 || WSAGetLastError() == WSAECONNRESET ) {
          printf( "Connection Closed.\n");
          break;
        }
        printf( "Bytes Recv: %ld\n", bytesRecv );
      }  WSACleanup();
      return;
    }