通过TCP将数据从C+发送到JSON服务器+;客户 我试图用C++中的JSON通过TCP向本地服务器发送数据。这是我的JSON服务器
comm.js通过TCP将数据从C+发送到JSON服务器+;客户 我试图用C++中的JSON通过TCP向本地服务器发送数据。这是我的JSON服务器,c++,json,node.js,tcp,C++,Json,Node.js,Tcp,comm.js 'use strict'; const net = require('net'); var client = new net.Socket(); var _SIGNATURE = 206; client.connect(5000, '192.168.1.107', function () { let info = { "alo":"alo" } let message = JSON.stringify(info); var message
'use strict';
const net = require('net');
var client = new net.Socket();
var _SIGNATURE = 206;
client.connect(5000, '192.168.1.107', function () {
let info = {
"alo":"alo"
}
let message = JSON.stringify(info);
var messageLength = Buffer.byteLength(message, 'utf8');
var buffer = Buffer.alloc(messageLength + 6);
console.log(buffer);
buffer.writeUInt16LE(_SIGNATURE, 0);
console.log(buffer);
buffer.writeUInt32LE(messageLength, 2);
console.log(buffer);
buffer.write(message, 6);
console.log(buffer);
console.log(`${buffer} -> ${messageLength}` );
client.write(buffer);
})
<强>和我的C++客户端
/**
C++ client
*/
#include<iostream> //cout
#include <sstream>
#include<stdio.h> //printf
#include<string.h> //strlen
#include<string> //string
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
#include<netdb.h> //hostent
using namespace std;
/**
TCP Client class
*/
class tcp_client {
private:
int sock;
std::string address;
int port;
struct sockaddr_in server;
public:
tcp_client();
bool conn(string, int);
bool send_data(string data);
string receive(int);
};
tcp_client::tcp_client() {
sock = -1;
port = 0;
address = "";
}
/**
Connect to a host on a certain port number
*/
bool tcp_client::conn(string address , int port) {
//create socket if it is not already created
if(sock == -1)
{
//Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
perror("Could not create socket");
}
cout<<"Socket created\n";
}
else { /* OK , nothing */ }
//setup address structure
if(inet_addr(address.c_str()) == -1) {
struct hostent *he;
struct in_addr **addr_list;
//resolve the hostname, its not an ip address
if ( (he = gethostbyname( address.c_str() ) ) == NULL) {
//gethostbyname failed
herror("gethostbyname");
cout<<"Failed to resolve hostname\n";
return false;
}
//Cast the h_addr_list to in_addr , since h_addr_list also has the ip address in long format only
addr_list = (struct in_addr **) he->h_addr_list;
for(int i = 0; addr_list[i] != NULL; i++) {
//strcpy(ip , inet_ntoa(*addr_list[i]) );
server.sin_addr = *addr_list[i];
cout<<address<<" resolved to "<<inet_ntoa(*addr_list[i])<<endl;
break;
}
}
//plain ip address
else {
server.sin_addr.s_addr = inet_addr( address.c_str() );
}
server.sin_family = AF_INET;
server.sin_port = htons( port );
//Connect to remote server
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) {
perror("connect failed. Error");
return 1;
}
cout<<"Connected\n";
return true;
}
/**
Send data to the connected host
*/
bool tcp_client::send_data(string data) {
//Send some data
if( send(sock , data.c_str() , strlen( data.c_str() ) , 0) < 0) {
perror("Send failed : ");
return false;
}
cout<<"Data send\n";
return true;
}
/**
Receive data from the connected host
*/
string tcp_client::receive(int size=512) {
char buffer[size];
string reply;
//Receive a reply from the server
if( recv(sock , buffer , sizeof(buffer) , 0) < 0) {
puts("recv failed");
}
reply = buffer;
return reply;
}
int main(int argc , char *argv[]) {
tcp_client c;
string host, test;
host = "192.168.1.107";
cout<<"Hostname : 192.168.1.107:5000";
//connect to host
c.conn(host , 5000);
//send some data
std::cout << "Enter string to send:" << '\n';
cin >> test;
c.send_data(test);
//receive and echo reply
cout<<"----------------------------\n\n";
cout<<c.receive(1024);
cout<<"\n\n----------------------------\n\n";
//done
return 0;
}
/**
C++客户端
*/
#包括//cout
#包括
#包括//printf
#包括//strlen
#包含//字符串
#包含//套接字
#包括//inet\u addr
#包括//hostent
使用名称空间std;
/**
TCP客户端类
*/
类tcp_客户端{
私人:
int袜子;
std::字符串地址;
国际港口;
服务器中的结构sockaddr_;
公众:
tcp_客户端();
布尔连接(字符串,整数);
bool发送_数据(字符串数据);
字符串接收(int);
};
tcp_客户端::tcp_客户端(){
sock=-1;
端口=0;
地址=”;
}
/**
连接到某个端口号上的主机
*/
bool tcp_客户端::conn(字符串地址,int端口){
//创建套接字(如果尚未创建)
如果(sock==-1)
{
//创建套接字
sock=socket(AF\u INET,sock\u STREAM,0);
如果(sock==-1)
{
perror(“无法创建套接字”);
}
您是否在发送/接收时出现了一些常见错误:
send
不一定发送整个缓冲区。您需要继续调用send
,直到发送完所有字节
recv
可能接收的数据少于预期,并且接收的数据不是以零结尾的,因此您不能对其执行strlen
,也不能将其传递给std::string
。而是执行reply.append(buffer,received_bytes);
,其中received_bytes
是recv
的返回值
您在
send/recv
中犯了一些常见错误:
send
不一定发送整个缓冲区。您需要继续调用send
,直到发送完所有字节
recv
可能接收的数据少于预期,并且接收的数据不是以零结尾的,因此您不能对其执行strlen
,也不能将其传递给std::string
。而是执行reply.append(buffer,received_bytes);
,其中received_bytes
是recv
的返回值
我还应该指出,TCP服务器和客户端是分开工作的,这意味着如果我使用使用正常TCP参数的服务器,客户端会连接,如果我使用JSON客户端,那么服务器也会工作。char buffer[size]不是有效的C++,它是VLA代码。JSON服务器需要接收< /代码>。在服务器代码中我没有看到这一点。我看到服务器在流上写“代码>签名/ <代码>客户端。为什么一旦使用了标准协议(如HTTP)来控制通信信道?一旦您解决了错误(以前)。您应该了解这段代码。我还应该指出,TCP服务器和客户端是分开工作的,这意味着如果我使用使用正常TCP参数的服务器,客户端将连接,如果我使用JSON客户端,那么服务器也可以工作。char buffer[size]不是有效的C++,它是VLA代码。JSON服务器需要接收< /代码>。在服务器代码中我没有看到这一点。我看到服务器在流上写“代码>签名/ <代码>客户端。为什么不使用标准协议(如HTTP)来控制通信信道?一旦你解决了错误(以前),你应该把这个代码带到