Hướng dẫn python socket recv missing data - python socket recv thiếu dữ liệu

Tôi đã viết một ứng dụng ứng dụng ổ cắm đơn giản để đọc dữ liệu trong Python 3.4

Vấn đề tôi đang gặp phải là khi máy chủ gửi một lượng nhỏ dữ liệu (khoảng 1000) byte, nó sẽ đọc nó một cách hoàn hảo nhưng khi một khối dữ liệu lớn được xử lý xung quanh (____6 byte) Chunk dữ liệu (như 1100-ish khối). Tôi dường như không thể tìm ra lý do tại sao nó hoạt động thất thường khi xử lý lượng dữ liệu khổng lồ. Tôi biết rằng dữ liệu của tôi không lớn hơn ssize_t tối đa là 32767.

Nó hoạt động hoàn hảo khi xử lý dữ liệu nhỏ và hoàn toàn biến 180 và hoạt động khác nhau khi xử lý một lượng dữ liệu khổng lồ. Tôi biết rằng đây không phải là vấn đề trong máy chủ TCP vì tôi đã thử nghiệm nó với máy khách PHP TCP và nó hoạt động hoàn hảo khi xử lý lượng dữ liệu khổng lồ.

Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

import socket
import json

# Written in Python 3.4.

class SocketClient:

    def __init__(self, host, port, format, timeout = None):
        # Constructor
        self.host = host
        self.port = port
        self.format = format
        self.timeout = timeout

        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def send(self, firstname, lastname, parameters = [], format = 'json'):
        if self.socket is not None:
            self.socket.connect((self.host, self.port))

            data = {}
            data['firstname'] = firstname
            data['lastname'] = lastname
            data['parameters'] = parameters
            data['format'] = format

            self.socket.send(bytes(json.dumps(data), "utf-8"))

            result = self.socket.recv(32767)
            result = result.decode()

            return result

    def shutdown(self):
        if socket is not None:
            self.socket.shutdown(socket.SHUT_RDWR)
            self.socket.close()


if __name__ == __main__:
    client = SocketClient("127.0.0.1", 8080, 'json')
    response = client.send('foo', 'bar', ['foobar'])
    print(response)
    client.shutdown()

Xếp hạng chủ đề:

  • 0 Bầu chọn - trung bình 0
  • 1
  • 2
  • 3
  • 4
  • 5

Byte đầu tiên bị thiếu trong khi nhận dữ liệu qua ổ cắm TCP

Kính gửi tất cả bạn bè. Tôi đang cố gắng liên lạc với máy chủ IEC-60870-5-104 thông qua các ổ cắm TCP. Máy chủ IEC được đặt trên máy chủ cục bộ 127.0.0.1: 2404 và tôi đang cố gắng gửi một tin nhắn hex với chức năng trợ giúp của send (). Vui lòng xem mã của tôi
I am trying to communicate with an IEC-60870-5-104 server through TCP sockets. The IEC server is located over the local host 127.0.0.1: 2404 and I am trying to send a HEX message with the help of send() function. Please look at my code

#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)

Bây giờ khi tôi chạy mã, nó kết nối thành công với máy chủ, gửi thông báo hex là 0x68 0x04 0x07 0x00 0x00 0x00
0x68 0x04 0x07 0x00 0x00 0x00

Đáp lại, nó nhận được thông báo Hex 0x68 0x04 0x0B 0x00 0x00 0x00 Tôi đã xác nhận điều này với Wireshark nhưng những gì tôi tìm thấy trên shell của mình là ====== .py ======== Ổ cắm thành công Dữ liệu đã tạo thành công: B'H \ x04 \ x0b \ x00 \ x00 \ x00 '>>> Chỉ có 5 byte được hiển thị, Byte đầu tiên 0x68 là đâu? Tôi phải nhận và hiển thị 0x68 0x04 0x0B 0x00 0x00 0x00, có chuyện gì vậy? Xin vui lòng giúp đỡ
I confirmed this with Wireshark but what I find on my shell is
======== RESTART: C:/Users/Shahrukh/Desktop/Python Coding/TCP Server.py ========
Socket successfully created
received data: b'h\x04\x0b\x00\x00\x00'
>>>
Only 5 bytes are shown, where is the 1st byte 0x68? I must receive and show 0x68 0x04 0x0B 0x00 0x00 0x00, whats wrong? Please help

Bài viết: 11.45611,456

Chủ đề: 436436

Tham gia: Tháng 9 năm 2016Sep 2016

Danh tiếng: 442 442

Không chắc chắn, nhưng điều này có thể liên quan đến chuyển đổi lớn, endian nhỏ. Đây là một blog về chủ đề: https://pythontic.com/modules/socket/byt...-cctions
Here's a blog on the subject: https://pythontic.com/modules/socket/byt...-functions

Bài viết: 1.8741,874

Chủ đề: 88

Tham gia: Tháng 5 năm 2017May 2017

Danh tiếng: 215 215

Tháng 11-19-2019, 05:33 PM (Bài đăng này được sửa đổi lần cuối: tháng 11-19-2019, 05:33 PM bởi Dead_eye.) (This post was last modified: Nov-19-2019, 05:33 PM by DeaD_EyE.)

Tôi đếm 6 byte. Byte đầu tiên là

#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
0. Bạn có một máy tính và bạn đang sử dụng ngôn ngữ lập trình. Chỉ cần sử dụng
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
1 để có được độ dài.
You have a computer and you're using a programming language.
Just use
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
1 to get the length.

In [2]: hex(ord('h'))                                                                                                       
Out[2]: '0x68'

Bức thư đầu tiên là ____10, là 104 trong ASCII và Unicode, là 0x68 trong Hex.

Tất cả các ký tự ASCII có thể in trong

#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
3 được biểu diễn dưới dạng phiên bản có thể in chứ không phải với giá trị hex. Nếu bạn muốn đại diện cho
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
3 dưới dạng chuỗi hex, bạn có thể sử dụng
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
5
If you want to represent the
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
3 as hex-string, you could use
#import the socket library 
import socket
  
# create a socket object 
s = socket.socket()          
print("Socket successfully created")
  
# connect to the server on local computer, 2404 default port for IEC-104 Server
s.connect(('127.0.0.1', 2404))
# send a hex message in bytes
s.send(b'\x68\x04\x07\x00\x00\x00')

data = s.recv(1024)

s.close()

print( "received data:", data)
5

import binascii

data = b'\x68\x04\x07\x00\x00\x00'
hexstr = binascii.hexlify(data, ' ', 1).decode()
# yes, hexlify return bytes
# the decode step is ugly
print(hexstr)

Output:

68 04 07 00 00 00

Gần như đã chết, nhưng quá lười biếng để chết: https://sourceerver.info tất cả con người cùng nhau. Chúng ta không cần các chính trị gia!
All humans together. We don't need politicians!

Bài viết: 22

Chủ đề: 11

Tham gia: tháng 11 năm 2019Nov 2019

Danh tiếng: 0 0

Ôi Chúa ơi, bây giờ tôi đã nhận được nó, về cơ bản là mã ASCII mà tôi đang nhận được. Cảm ơn bạn rât nhiêu.

Có thể các chủ đề liên quan…
Chủ đề Tác giả Trả lời Lượt xem Bài cuối cùng
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo2 572 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: paulyan
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo0 831 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: ilknurg
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo4 1,077 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: amdi40
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo2 1,543 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: korenron
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo0 648 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: snippyro
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo6 2,297 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: Pedroski55
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo12 7,427 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: tienttt
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo0 1,915 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: wood_6636
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo8 28,722 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: karkas
& nbsp;SMA (AVG di chuyển đơn giản) không nhận được dữ liệu (giá cổ phiếu).gdbengo4 2,919 Jul-31-2022, 08:20 PM Bài cuối cùng: Paulyan
Last Post: PythonNmap

Recv () trở lại trong Python là gì?

Hàm recv () sẽ trả về độ dài của tin nhắn được ghi vào bộ đệm được trỏ bởi đối số bộ đệm. Đối với các ổ cắm dựa trên tin nhắn, chẳng hạn như sock_dgram và sock_seqpacket, toàn bộ tin nhắn sẽ được đọc trong một thao tác duy nhất.the length of the message written to the buffer pointed to by the buffer argument. For message-based sockets, such as SOCK_DGRAM and SOCK_SEQPACKET, the entire message shall be read in a single operation.

RECV có chờ đợi dữ liệu python không?

RECV sẽ đợi cho đến khi nhận được dữ liệu.Bạn có thể thay đổi điều đó bằng cách đặt thời gian chờ.Có hơn 1024 byte có sẵn.. You can change that by setting a timeout. There is more than 1024 bytes available.

SOCKED có phải chờ dữ liệu không?

Nếu không có dữ liệu đến có sẵn tại ổ cắm, các khối cuộc gọi RECV và chờ dữ liệu đến theo các quy tắc chặn được xác định cho WSARECV với cờ MSG_PARTIAL không được đặt trừ khi ổ cắm không chặn.Trong trường hợp này, giá trị của socket_error được trả về với mã lỗi được đặt thành wsaewouldblock.

RECV có phải là một cuộc gọi chặn python không?

Nếu dữ liệu không có sẵn cho ổ cắm và ổ cắm ở chế độ chặn, cuộc gọi recv () sẽ chặn trình gọi cho đến khi dữ liệu đến.Nếu dữ liệu không khả dụng và ổ cắm ở chế độ không chặn, recv () trả về -1 và đặt mã lỗi thành EwouldBlock.. If data is not available and socket is in nonblocking mode, recv() returns a -1 and sets the error code to EWOULDBLOCK.