Struct error required argument is not an integer

Using sqlAlchemey with PyMySQL, db connection works fine, the app runs fine, but after the app has ran to completion with dozens of queries, inserts, and updates we close the DB connection and the ...

Using sqlAlchemey with PyMySQL, db connection works fine, the app runs fine, but after the app has ran to completion with dozens of queries, inserts, and updates we close the DB connection and the application ends, then it throws a PyMYSQL Error:

DB Setup Code:

def __init__(self):
    set_data = {}
    set_data["db_ip"] = "127.0.0.1"
    set_data["db_name"] = "***db name***"
    set_data["db_user"] = "***db user***
    set_data["db_pass"] = "***db password**!"
    set_data["db_port"] = 3306
    engine_str = (
        "mysql+pymysql://"
        + set_data["db_user"]
        + ":"
        + set_data["db_pass"]
        + "@"
        + set_data["db_ip"]
        + ":" + str(set_data["db_port"])
        + "/"
        + set_data["db_name"]
        )

    engine = create_engine(
        engine_str,
        pool_size=10,
        max_overflow=20,
        pool_pre_ping=True,
        pool_recycle=1100
    )

    self.metadata = MetaData(bind=engine)
    self.session = scoped_session(sessionmaker(autocommit=False, autoflush=True, bind=engine))
    self.engine = engine
    conn = engine.connect()
    self.conn = conn

DB Teardown Code:

def session_scope_end(cbdb):
    logger.info("Closing Session Scope")
    try:
        yield cbdb.session
        cbdb.session.commit()
    except Exception as e:
        error = str(e)
        logger.warning(error)
        cbdb.session.rollback()
        raise
    finally:
        cbdb.session.close()
    cbdb.session.close()
    cbdb.engine.dispose()
    cbdb.conn.detach()
    cbdb.conn.close()
    return cbdb

Environment
OS: Ubuntu 20.04
Server version: 8.0.19 — MySQL Community Server — GPL
Protocol version: 10
PyMySQL version: 1.0.2
Python: 3.8.5

Error
Exception during reset or similar

Traceback (most recent call last):
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 739, in _finalize_fairy
    fairy._reset(pool)
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 988, in _reset
    pool._dialect.do_rollback(self)
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 667, in do_rollback
    dbapi_connection.rollback()
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/pymysql/connections.py", line 479, in rollback
    self._execute_command(COMMAND.COM_QUERY, "ROLLBACK")
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/pymysql/connections.py", line 813, in _execute_command
    prelude = struct.pack("<iB", packet_size, command)
struct.error: required argument is not an integer
Exception closing connection <pymysql.connections.Connection object at 0x7f90f55cb250>
Traceback (most recent call last):
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 739, in _finalize_fairy
    fairy._reset(pool)
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 988, in _reset
    pool._dialect.do_rollback(self)
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 667, in do_rollback
    dbapi_connection.rollback()
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/pymysql/connections.py", line 479, in rollback
    self._execute_command(COMMAND.COM_QUERY, "ROLLBACK")
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/pymysql/connections.py", line 813, in _execute_command
    prelude = struct.pack("<iB", packet_size, command)
struct.error: required argument is not an integer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 247, in _close_connection
    self._dialect.do_close(connection)
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 673, in do_close
    dbapi_connection.close()
  File "/home/krypterro/PyApps/devbot/.venv/lib/python3.8/site-packages/pymysql/connections.py", line 408, in close
    send_data = struct.pack("<iB", 1, COMMAND.COM_QUIT)
struct.error: required argument is not an integer

Recommend Projects

  • React photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

Я пытаюсь создать сетевой прокси, который будет пересылать пакеты на другой IP-адрес. Я могу обнюхать пакет, распаковать его, просмотреть, распечатать и управлять его содержимым. Но когда я хочу упаковать байты для пересылки на какой-то другой IP-адрес, он выдает эту ошибку:

struct.error: required argument is not an integer

Ошибка возникает в этой строке кода:

ip_header = struct.pack('!BBHHHBBH4s4s' ,version_IHL, TOS, totalLength, ID,flags, TTL,protocolNR, checksum,sourceAddress,destinationAddress)

Вот код. Полужирный шрифт в коде — это комментарии в моем коде.

import socket
import sys
import struct
import re
import logging
import struct
from scapy.all import *
import Functions
logging.basicConfig(filename='example.log',level=logging.DEBUG)

hold = "192.168.0.125"

print ("nttt**************************")
print ("ttt*****SettingUp Server*****")
print ("ttt**************************nn")
print("t*****Implementing DHKE")
print ("t*****Generating server public & private keypairs now . . .")
(e,n), private = Functions.generate_keypair(7, 11)
print ("*****Public Key: {} , {} ", e,n)
print ("*****Private key: {} ", private)
public = (e,n)
ip = '192.168.0.125'
port = 5001

# the public network interface
#HOST = socket.gethostbyname(socket.gethostname())
#..............................................................................................
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind(('192.168.0.117',5001))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('format=%(asctime)s %(message)s')

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

#..............................................................................................
data = Functions.recievedata(s)
logging.info('**Packet Recieved')
print("Packet Recieved")

#function_data = tuple(struct.unpack(data))
unpacked_data = struct.unpack('!BBHHHBBH4s4s',data[:20])
listunpacked = list(unpacked_data)
logging.info('--> Unpacking packet')
version_IHL = unpacked_data[0]
version = version_IHL >>4
IHL = version_IHL & 0xF
TOS = unpacked_data[1]
totalLength = unpacked_data[2]
ID = unpacked_data[3]
flags = unpacked_data[4]
fragmentOffset =  unpacked_data[4] &  0x1FFF
TTL = unpacked_data[5]
protocolNR = unpacked_data[6]
checksum = unpacked_data[7]
sourceAddress = socket.inet_ntoa(unpacked_data[8])
destinationAddress = socket.inet_ntoa(unpacked_data[9])



#..............................................................................................
print("An IP packet with the size %i is captured.", (totalLength))
print("Raw data: "+ str(data))
print("nParsed data")
print("Version:tt"+ str(version))
print("Header length:tt"+ str(IHL*4)+'bytes')
print("Type of service:tt" + str(Functions.getTOS(TOS)))
print("Length:ttt"+str(totalLength))
print("ID:ttt"+str(hex(ID)) + ' {' + str(ID) + '}')
print("Flags:ttt" + Functions.getFlags(flags))
print("Fragment offset:t" + str(fragmentOffset))
print( "TTL:ttt"+str(TTL))
print("Protocol:tt" + Functions.getProtocol(protocolNR))
print("Checksum:tt" + str(checksum))
print("Source:ttt" + sourceAddress)
print("Destination:tt" + destinationAddress)
print("Payload:n"+str(data[20:]))
# receive a package
#print(s.recvfrom(65565))
#IP = input("Enter IP address to send: ")
#port = int(input("Port: "))

#..............................................................................................
print("tOld Destination: "+ destinationAddress)

listunpacked[9] = hold
unpacked_data = tuple(listunpacked)
print("nttNew Address is: "+ unpacked_data[9])
print()
#s.inet_aton(unpacked_data[9]) = hold

#unpacked_data = tuple(listunpacked)
#unpacked_data = bytes(unpacked_data)
#destinationAddress = socket.inet_ntoa(unpacked_data[9])
#..............................................................................................
# tcp header fields
tcp_source = 80  # source port
tcp_dest = 5001  # destination port
tcp_seq = 454
tcp_ack_seq = 0
tcp_doff = 5  # 4 bit field, size of tcp header, 5 * 4 = 20 bytes
# tcp flags
tcp_fin = 0
tcp_syn = 1
tcp_rst = 0
tcp_psh = 0
tcp_ack = 0
tcp_urg = 0
tcp_window = socket.htons(5840)  # maximum allowed window size
tcp_check = 0
tcp_urg_ptr = 0
tcp_offset_res = (tcp_doff << 4) + 0
tcp_flags = tcp_fin + (tcp_syn << 1) + (tcp_rst << 2) + (tcp_psh << 3) + (tcp_ack << 4) + (tcp_urg << 5)

# the ! in the pack format string means network order
tcp_header = tuple(struct.pack('!HHLLBBHHH', tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags, tcp_window,tcp_check, tcp_urg_ptr))
#p =(data+tcp_header)

#hold = bytes(hold,"utf-8")
#hold  = socket.inet_aton ( hold )
#checksum = bytes(checksum,"utf-8")
#destinationAddress = c_int(listunpacked[9])
checksum = bytes(str(checksum),"utf-8")
#ip_header = struct.pack('!BBHHHBBH4s4s' , version_IHL, TOS, totalLength, ID,flags, TTL,protocolNR, checksum,sourceAddress,destinationAddress)
#tcp_header = struct.pack('!HHLLBBH' , tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags,  tcp_window) + struct.pack('H' , tcp_check) + struct.pack('!H' , tcp_urg_ptr)

#packet = ip_header + tcp_header + str(data[20:])
message = "How are  you"
#data = bytes(unpacked_data,"utf-8") + tcp_header + message
ip_header = struct.pack('!BBHHHBBH4s4s' ,version_IHL, TOS, totalLength, ID,flags, TTL,protocolNR, checksum,sourceAddress,destinationAddress)
data = bytes(unpacked_data) + data[20:]
s.sendto(data, ("192.168.0.125" , 5001))
print("Packet sent")
# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

This module performs conversions between Python values and C structs represented
as Python bytes objects. This can be used in handling binary data
stored in files or from network connections, among other sources. It uses
Format Strings as compact descriptions of the layout of the C
structs and the intended conversion to/from Python values.

Several struct functions (and methods of Struct) take a buffer
argument. This refers to objects that implement the Buffer Protocol and
provide either a readable or read-writable buffer. The most common types used
for that purpose are bytes and bytearray, but many other types
that can be viewed as an array of bytes implement the buffer protocol, so that
they can be read/filled without additional copying from a bytes object.

7.1.1. Functions and Exceptions¶

The module defines the following exception and functions:

exception struct.error

Exception raised on various occasions; argument is a string describing what
is wrong.

struct.pack(fmt, v1, v2, )

Return a bytes object containing the values v1, v2, … packed according
to the format string fmt. The arguments must match the values required by
the format exactly.

struct.pack_into(fmt, buffer, offset, v1, v2, )

Pack the values v1, v2, … according to the format string fmt and
write the packed bytes into the writable buffer buffer starting at
position offset. Note that offset is a required argument.

struct.unpack(fmt, buffer)

Unpack from the buffer buffer (presumably packed by pack(fmt, ...))
according to the format string fmt. The result is a tuple even if it
contains exactly one item. The buffer’s size in bytes must match the
size required by the format, as reflected by calcsize().

struct.unpack_from(fmt, buffer, offset=0)

Unpack from buffer starting at position offset, according to the format
string fmt. The result is a tuple even if it contains exactly one
item. The buffer’s size in bytes, minus offset, must be at least
the size required by the format, as reflected by calcsize().

struct.iter_unpack(fmt, buffer)

Iteratively unpack from the buffer buffer according to the format
string fmt. This function returns an iterator which will read
equally-sized chunks from the buffer until all its contents have been
consumed. The buffer’s size in bytes must be a multiple of the size
required by the format, as reflected by calcsize().

Each iteration yields a tuple as specified by the format string.

New in version 3.4.

struct.calcsize(fmt)

Return the size of the struct (and hence of the bytes object produced by
pack(fmt, ...)) corresponding to the format string fmt.

7.1.2. Format Strings¶

Format strings are the mechanism used to specify the expected layout when
packing and unpacking data. They are built up from Format Characters,
which specify the type of data being packed/unpacked. In addition, there are
special characters for controlling the Byte Order, Size, and Alignment.

7.1.2.1. Byte Order, Size, and Alignment¶

By default, C types are represented in the machine’s native format and byte
order, and properly aligned by skipping pad bytes if necessary (according to the
rules used by the C compiler).

Alternatively, the first character of the format string can be used to indicate
the byte order, size and alignment of the packed data, according to the
following table:

Character Byte order Size Alignment
@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none

If the first character is not one of these, '@' is assumed.

Native byte order is big-endian or little-endian, depending on the host
system. For example, Intel x86 and AMD64 (x86-64) are little-endian;
Motorola 68000 and PowerPC G5 are big-endian; ARM and Intel Itanium feature
switchable endianness (bi-endian). Use sys.byteorder to check the
endianness of your system.

Native size and alignment are determined using the C compiler’s
sizeof expression. This is always combined with native byte order.

Standard size depends only on the format character; see the table in
the Format Characters section.

Note the difference between '@' and '=': both use native byte order, but
the size and alignment of the latter is standardized.

The form '!' is available for those poor souls who claim they can’t remember
whether network byte order is big-endian or little-endian.

There is no way to indicate non-native byte order (force byte-swapping); use the
appropriate choice of '<' or '>'.

Notes:

  1. Padding is only automatically added between successive structure members.
    No padding is added at the beginning or the end of the encoded struct.
  2. No padding is added when using non-native size and alignment, e.g.
    with ‘<’, ‘>’, ‘=’, and ‘!’.
  3. To align the end of a structure to the alignment requirement of a
    particular type, end the format with the code for that type with a repeat
    count of zero. See Examples.

7.1.2.2. Format Characters¶

Format characters have the following meaning; the conversion between C and
Python values should be obvious given their types. The ‘Standard size’ column
refers to the size of the packed value in bytes when using standard size; that
is, when the format string starts with one of '<', '>', '!' or
'='. When using native size, the size of the packed value is
platform-dependent.

Format C Type Python type Standard size Notes
x pad byte no value    
c char bytes of length 1 1  
b signed char integer 1 (1),(3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long
long
integer 8 (2), (3)
n ssize_t integer   (4)
N size_t integer   (4)
e (7) float 2 (5)
f float float 4 (5)
d double float 8 (5)
s char[] bytes    
p char[] bytes    
P void * integer   (6)

Changed in version 3.3: Added support for the 'n' and 'N' formats.

Changed in version 3.6: Added support for the 'e' format.

Notes:

  1. The '?' conversion code corresponds to the _Bool type defined by
    C99. If this type is not available, it is simulated using a char. In
    standard mode, it is always represented by one byte.

  2. The 'q' and 'Q' conversion codes are available in native mode only if
    the platform C compiler supports C long long, or, on Windows,
    __int64. They are always available in standard modes.

  3. When attempting to pack a non-integer using any of the integer conversion
    codes, if the non-integer has a __index__() method then that method is
    called to convert the argument to an integer before packing.

    Changed in version 3.2: Use of the __index__() method for non-integers is new in 3.2.

  4. The 'n' and 'N' conversion codes are only available for the native
    size (selected as the default or with the '@' byte order character).
    For the standard size, you can use whichever of the other integer formats
    fits your application.

  5. For the 'f', 'd' and 'e' conversion codes, the packed
    representation uses the IEEE 754 binary32, binary64 or binary16 format (for
    'f', 'd' or 'e' respectively), regardless of the floating-point
    format used by the platform.

  6. The 'P' format character is only available for the native byte ordering
    (selected as the default or with the '@' byte order character). The byte
    order character '=' chooses to use little- or big-endian ordering based
    on the host system. The struct module does not interpret this as native
    ordering, so the 'P' format is not available.

  7. The IEEE 754 binary16 “half precision” type was introduced in the 2008
    revision of the IEEE 754 standard. It has a sign
    bit, a 5-bit exponent and 11-bit precision (with 10 bits explicitly stored),
    and can represent numbers between approximately 6.1e-05 and 6.5e+04
    at full precision. This type is not widely supported by C compilers: on a
    typical machine, an unsigned short can be used for storage, but not for math
    operations. See the Wikipedia page on the half-precision floating-point
    format for more information.

A format character may be preceded by an integral repeat count. For example,
the format string '4h' means exactly the same as 'hhhh'.

Whitespace characters between formats are ignored; a count and its format must
not contain whitespace though.

For the 's' format character, the count is interpreted as the length of the
bytes, not a repeat count like for the other format characters; for example,
'10s' means a single 10-byte string, while '10c' means 10 characters.
If a count is not given, it defaults to 1. For packing, the string is
truncated or padded with null bytes as appropriate to make it fit. For
unpacking, the resulting bytes object always has exactly the specified number
of bytes. As a special case, '0s' means a single, empty string (while
'0c' means 0 characters).

When packing a value x using one of the integer formats ('b',
'B', 'h', 'H', 'i', 'I', 'l', 'L',
'q', 'Q'), if x is outside the valid range for that format
then struct.error is raised.

Changed in version 3.1: In 3.0, some of the integer formats wrapped out-of-range values and
raised DeprecationWarning instead of struct.error.

The 'p' format character encodes a “Pascal string”, meaning a short
variable-length string stored in a fixed number of bytes, given by the count.
The first byte stored is the length of the string, or 255, whichever is
smaller. The bytes of the string follow. If the string passed in to
pack() is too long (longer than the count minus 1), only the leading
count-1 bytes of the string are stored. If the string is shorter than
count-1, it is padded with null bytes so that exactly count bytes in all
are used. Note that for unpack(), the 'p' format character consumes
count bytes, but that the string returned can never contain more than 255
bytes.

For the '?' format character, the return value is either True or
False. When packing, the truth value of the argument object is used.
Either 0 or 1 in the native or standard bool representation will be packed, and
any non-zero value will be True when unpacking.

7.1.2.3. Examples¶

Note

All examples assume a native byte order, size, and alignment with a
big-endian machine.

A basic example of packing/unpacking three integers:

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
b'x00x01x00x02x00x00x00x03'
>>> unpack('hhl', b'x00x01x00x02x00x00x00x03')
(1, 2, 3)
>>> calcsize('hhl')
8

Unpacked fields can be named by assigning them to variables or by wrapping
the result in a named tuple:

>>> record = b'raymond   x32x12x08x01x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)

The ordering of format characters may have an impact on size since the padding
needed to satisfy alignment requirements is different:

>>> pack('ci', b'*', 0x12131415)
b'*x00x00x00x12x13x14x15'
>>> pack('ic', 0x12131415, b'*')
b'x12x13x14x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5

The following format 'llh0l' specifies two pad bytes at the end, assuming
longs are aligned on 4-byte boundaries:

>>> pack('llh0l', 1, 2, 3)
b'x00x00x00x01x00x00x00x02x00x03x00x00'

This only works when native size and alignment are in effect; standard size and
alignment does not enforce any alignment.

See also

Module array
Packed binary storage of homogeneous data.
Module xdrlib
Packing and unpacking of XDR data.

7.1.3. Classes¶

The struct module also defines the following type:

class struct.Struct(format)

Return a new Struct object which writes and reads binary data according to
the format string format. Creating a Struct object once and calling its
methods is more efficient than calling the struct functions with the
same format since the format string only needs to be compiled once.

Compiled Struct objects support the following methods and attributes:

pack(v1, v2, )

Identical to the pack() function, using the compiled format.
(len(result) will equal size.)

pack_into(buffer, offset, v1, v2, )

Identical to the pack_into() function, using the compiled format.

unpack(buffer)

Identical to the unpack() function, using the compiled format.
The buffer’s size in bytes must equal size.

unpack_from(buffer, offset=0)

Identical to the unpack_from() function, using the compiled format.
The buffer’s size in bytes, minus offset, must be at least
size.

iter_unpack(buffer)

Identical to the iter_unpack() function, using the compiled format.
The buffer’s size in bytes must be a multiple of size.

New in version 3.4.

format

The format string used to construct this Struct object.

size

The calculated size of the struct (and hence of the bytes object produced
by the pack() method) corresponding to format.

Понравилась статья? Поделить с друзьями:
  • Struct error i format requires 2147483648 number 2147483647
  • Struct error argument out of range
  • Strtrail txt ошибка виндовс 10
  • Strtrail txt ошибка windows 10 как исправить
  • Stronghold ошибка 0xc0000022 windows 10