在iOS项目中使用python sendall时,Recv失败

时间:2011-03-29 05:57:56

标签: iphone python sockets networking

我有一个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项目中的套接字是不同的吗?

0 个答案:

没有答案