我正在将整数转换为字符并尝试将它们从 C 客户端发送到另一台计算机上的 Python 服务器。获取 'send: Bad address'

I'm converting ints to chars and trying to send them from a C client to a Python server on another computer. Getting 'send: Bad address'

在一台装有客户端(用 C 编写)的计算机上,当我尝试将字符发送到另一台装有用 Python 编写的服务器的计算机时,出现错误 send: Bad address。但是地址不错。
如果我只是发送一个书面字符串而不是字符,"A string written like this" 我可以将它很好地发送到服务器并看到它毫无问题地打印出来。所以,我不认为地址真的有问题。

我也尝试过将 int 转换为字符串。编译 cannot convert string to char 时出现错误。我试过各种变体,但我只能用如下编写的客户端进行编译。

客户端(C)

#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

#define ADDR "192.168.0.112"
#define PORT "12003"

void sendall(int socket, char *bytes, int length)
{
    int n = 0, total = 0;
    while (total < length) {
        n = send(socket, bytes + total, total-length, 0);
        if (n == -1) {
            perror("send");
            exit(1);
        }
        total += n;
    }
}

void thesock(char *ADDRf, char *PORTf, char *RAZZstr)
{
    struct addrinfo hints = {0}, *addr = NULL;
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    int status = getaddrinfo(ADDRf, PORTf, &hints, &addr);
    if (status != 0) {
        std::cerr << "Error message";
        exit(1);
    }
    
    int sock = -1;
    struct addrinfo *p = NULL;
    for (p = addr; p != NULL; p = addr->ai_next) {
        sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
        if (sock == -1) {
                continue;
        }
        if (connect(sock, p->ai_addr, p->ai_addrlen) != -1) {
                break;
        }
        close(sock);
    }
    if (p == NULL) {
        fprintf(stderr, "connect(), socket()\n");
        exit(1);
    }
    sendall(sock, RAZZstr, 12);
    close(sock);
}

int main()
{
    int someInt = 321;
    char strss[12];
    sprintf(strss, "%d", someInt);  
    
    thesock(ADDR, PORT, strss);

    return 0;
}

上面代码的最后一部分是输入字符或字符串的地方。在这部分代码中,您可以将 thesock 中的 strss 替换为 strss 位置 "just like this" 中写入的字符串,它将发送到另一台计算机上写入的服务器在 Python。虽然,在编译时我确实收到警告 ISO C++ forbids converting a string constant to ‘char*’.

服务器(在Python)

import os
import sys
import socket

s=socket.socket()

host='192.168.0.112'
port=12003

s.bind((host,port))
s.listen(11)

while True:
    c, addr=s.accept()
    content=c.recv(29).decode('utf-8')

    print(content)  

此服务器解码 utf-8。我不知道这里是否可以选择不同的 'decode'。我不认为 Python 有 'chars'.

TL;DR:这与 IP 地址方面的“地址”无关,但它是关于对本地内存访问的无效访问。

int n = 0, total = 0;
while (total < length) {
    n = send(socket, bytes + total, total-length, 0);

total - length 是一个负数,即 0-12 = -12 在您的情况下。 send 的第三个参数是 size_t 类型,即无符号整数。负数 (-12) 因此被转换为无符号整数,从而产生一个巨大的无符号整数。

这导致 send 访问远远超出为 bytes 分配的内存的内存,因此 EFAULT“错误地址”。