Recv терпит неудачу при использовании python sendall в проекте iOS - PullRequest
0 голосов
/ 29 марта 2011

У меня есть сервер Python, который пытается отправить двоичный файл клиенту на iOS, но 90% времени файл является неполным.Прием вызова на клиенте завершается неудачно после получения около 80% файла.

Это в основном то, как он настроен.

Сервер

class ForkingTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
            f = open(TEST_FILE_NAME, 'rb')
            file_data = f.read()
            self.request.sendall(file_data)
            f.close()

class ForkingTCPServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
    pass

if __name__ == '__main__':  
    try:
        server = ForkingTCPServer(('0.0.0.0', 9000), ForkingTCPRequestHandler)
    except socket.error as e:
        sys.exit(1)

    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
        sys.exit(0)

Этот код работает за пределами нашего проекта iOS (весь файл получен)

int receiveFile() {   
    /* ... */

    /* Receive file */
    tempBuf = (char*) malloc(sizeof(char)*fileLen);
    totalRecv = 0;
    recvBytes = 0;

    while (totalRecv < fileLen) {
        recvBytes = recv(s, tempBuf+totalRecv, 1<<14, 0);
        if (recvBytes < 0) {
            free(tempBuf);
            close(s);
            return -1;
        }
        totalRecv += recvBytes;        
    }

    close(s);
    return 0;
}

int connectToServerWithHostname(char *hostname, char *port) {
    /* ... */

    memset(&targetAddr, 0, sizeof(targetAddr));
    targetAddr.sin_family = AF_INET;
    targetAddr.sin_port = htons(atoi(port));
    bcopy(hostdetails->h_addr, (char *)&targetAddr.sin_addr, hostdetails->h_length);

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (socket < 0) {
            return -1;
    }

    rc = connect(sock, (struct sockaddr *)&targetAddr, sizeof(targetAddr));
    if (rc < 0) {
            close(sock);
            return -1;
    }

    return sock;
}

int main(int argc, char **argv) {
    assert(!receiveFile());
    return 0;
}

Но этот эквивалентный код в нашем проекте iOS не работает (частичное получение).Даже при том, что я соединяюсь и получаю то же самое как код выше.

while (totalRecv < ntohl(symProcPacket.totalDataLen)) {
    recvBytes = recv(s, tempBuf+totalRecv, DEFAULT_SENDRECVSIZE, DEFAULT_SENDRECV_FLAGS);
    if (recvBytes < 0) {
        debug("Error, could not receive file\n");
        free(tempBuf);
        errorType = kSymClientErrorReceiving;
        goto errorImporting;
    }
    totalRecv += recvBytes;
    printf("Received: %d/%d\n", totalRecv, ntohl(symProcPacket.totalDataLen));
}

Любые идеи о том, почему это терпит неудачу?

Отличаются ли сокеты в проекте iOS иличто-то?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...