gpt4 book ai didi

java - Socket Java 到 C++ - 消息的长度始终为 8192 个字符

转载 作者:行者123 更新时间:2023-11-28 06:24:08 25 4
gpt4 key购买 nike

我正在实现从 Java 到 C++ 程序的 TCP 套接字连接。目前它是一种方式,但总有一天会变成双向的。我的消息很长(约 100.000 个字符)。不知何故,我的应用程序一次只能发送 8192 个字符/字节。怎么可能?有什么工具可以帮助调试?客户端和服务器都在本地 Windows 机器上运行。我不熟悉网络编程,所以任何帮助表示赞赏!非常感谢!

到目前为止,这是我的代码:

Java:
建立联系:

try {
serverSocket = new ServerSocket(socketPort);
System.out.println("waiting for client ...");
while (true) {
clientSocket = serverSocket.accept();
System.out.println("client connected.");
if (clientSocket!=null) break;
}
}
catch (IOException e) {
System.out.println(e);
}

发送东西:

OutputStream out = clientSocket.getOutputStream();
BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));

//send the new data to client
PrintWriter pw = new PrintWriter(out, true);
String outString = "VERY LONG TEXT ENDING WITH SPECIAL LETTER LIKE $";
pw.println(outString);

C++:

建立联系

bool connectToHost(int PortNo, char* IPAddress)
{
//Start up Winsock…
WSADATA wsadata;

int error = WSAStartup(0x0202, &wsadata);

//Did something happen?
if (error)
return false;

//Did we get the right Winsock version?
if (wsadata.wVersion != 0x0202)
{
WSACleanup(); //Clean up Winsock
return false;
}

//Fill out the information needed to initialize a socket…
SOCKADDR_IN target; //Socket address information

target.sin_family = AF_INET; // address family Internet
target.sin_port = htons (PortNo); //Port to connect on
target.sin_addr.s_addr = inet_addr (IPAddress); //Target IP

mSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket
if (mSocket == INVALID_SOCKET)
{
return false; //Couldn't create the socket
}

//Try connecting...
if (connect(mSocket, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR)
{
return false; //Couldn't connect
}
else
return true; //Success
}

接收东西:

if (connectToHost(3141, "127.0.0.1")) 
{
int iResult;
char recvbuf[DEFAULT_BUFLEN]; // DEFAULT_BUFLEN = 1000000
// Receive until the peer closes the connection
do {

iResult = recv(mSocket, recvbuf, DEFAULT_BUFLEN, 0); // DEFAULT_BUFLEN = 1000000
if ( iResult > 0 )
{
std::cout<<"recvbuf: "<< recvbuf[strlen(recvbuf)-1]<<""<< std::endl; //not the last character that I sent, but supposed to be
std::cout<<"recvbuf size: "<< iResult <<""<< std::endl; //fist are 8192 and then add up until sent size
}
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed with error: %d\n", WSAGetLastError());

} while( iResult > 0 );
} else
{
printf("connect failed\n");
}

最佳答案

TCP 套接字基于字节流概念工作。 TCP 套接字确保您的数据以字节流的形式无误且有序地到达。发送方将字节添加到 TCP 字节流,套接字负责将它们发送到目的地。套接字不会分隔您的逻辑消息;您有责任为字节流中嵌入的任何逻辑消息插入分隔符。每次向套接字写入字节时,TCP 套接字不一定会在套接字上发送一个数据包。这是为了提高效率,这是通过数据字节数与发送的总字节数(数据 + 开销)来衡量的。您可以阅读有关 Nagle's algorithm for TCP 的信息.

从套接字读取时,您再次使用字节流。您需要调用 receive 的次数可能与调用 send 的次数不匹配。但是你知道正确的字节会按顺序传送,并且这些字节的数量将与发送的字节数相同。

大小 8192 可能是触发发送数据包的缓冲区大小。

如果您只发送 1 个字节,然后刷新套接字,您应该只会在接收端看到一个字节。您还可以通过在 java socket options 中设置 TCP_NODELAY 来禁用 Nagle 的算法。 .

关于java - Socket Java 到 C++ - 消息的长度始终为 8192 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28815833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com