我正在将整数转换为字符并尝试将它们从 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“错误地址”。
在一台装有客户端(用 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“错误地址”。