Java C服务器套接字变为错误数据包
我有以下问题:Java C服务器套接字变为错误数据包,java,c,sockets,utf-8,Java,C,Sockets,Utf 8,我有以下问题: 我有一个Java客户端,使用ApacheMina框架发送字符串 我编写了一个C服务器来接收字符串 因此,我尝试向服务器发送一个utf8字符:myStringToSend=“Ä” 我调试了mina源代码以查看字节或十六进制格式的数据包,mina很好地转换了字符串,因此它发送了0xC30x84 我还在wireshark网络查看器中检查发送的数据包,它也将0xC30x84视为数据包,一切正常 但是我的C-server接收到以下字节:ffffffffc3ffffff84 我不知道怎么
- 我有一个Java客户端,使用ApacheMina框架发送字符串
- 我编写了一个C服务器来接收字符串
- 因此,我尝试向服务器发送一个utf8字符:myStringToSend=“Ä”
- 我调试了mina源代码以查看字节或十六进制格式的数据包,mina很好地转换了字符串,因此它发送了
0xC3
0x84
- 我还在wireshark网络查看器中检查发送的数据包,它也将
0xC3
视为数据包,一切正常0x84
- 但是我的C-server接收到以下字节:
ffffffffc3ffffff84
#include "stdafx.h"
#include <io.h>
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define DEFAULT_BUFLEN 512
#define TOOBIG 100000
int main(int argc, char *argv[])
{
WSADATA wsa;
int i, c, iResult, iSendResult, outputCounter;
SOCKET listenSocket = INVALID_SOCKET, clientSocket = INVALID_SOCKET;
struct sockaddr_in server, client;
char *message;
char sendbuf[DEFAULT_BUFLEN];
unsigned char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != NO_ERROR)
{
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}
printf("Initialised.\n");
if((listenSocket = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP )) == INVALID_SOCKET) //IPv4, TCP
{
printf("Could not create socket : %d" , WSAGetLastError());
WSACleanup();
return 1;
}
printf("Socket created.\n");
memset(&server, '0', sizeof(server));
memset(sendbuf, '0', sizeof(sendbuf));
server.sin_family = AF_INET;
//server.sin_addr.s_addr = htonl(0x7F000001); //localhost - 127.0.0.1
server.sin_addr.s_addr = inet_addr("127.0.0.1");
//server.sin_addr.s_addr = inet_addr("10.48.53.166");
server.sin_port = htons(7368);
if( bind(listenSocket ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d" , WSAGetLastError());
closesocket(listenSocket);
WSACleanup();
return 1;
}
puts("Bind done");
listen(listenSocket, 10);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
message = "{\"id\":2,\"result\":{\"code\":\"999\",\"message\":\"AddPageRange StartIndex don't match Inspection Counter\"},\"Client_ID\":\"PQCS1\",\"jsonrpc\":\"2.0\",\"Protocol\":\"2H\"}";
while( (clientSocket = accept(listenSocket , (struct sockaddr *)NULL, NULL)) != INVALID_SOCKET )
{
puts("Connection accepted");
do {
iResult = recv(clientSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
{
printf("Bytes received: %d\n", iResult);
recvbuf[iResult] = '\0';
outputCounter = 0;
while(recvbuf[outputCounter] != '\0')
printf("%X", (unsigned char)recvbuf[outputCounter++]);
iSendResult = send( clientSocket, message, strlen(message), 0 );
if (iSendResult == SOCKET_ERROR)
{
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 1;
}
printf("Bytes sent: %d\n", iSendResult);
}
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while( iResult > 0 );
}
if (clientSocket == INVALID_SOCKET)
{
printf("accept failed with error code : %d" , WSAGetLastError());
return 1;
}
closesocket(listenSocket);
WSACleanup();
return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)//Winsock库
#定义默认值\u BUFLEN 512
#定义太大100000
int main(int argc,char*argv[])
{
WSADATA wsa;
int i、c、iResult、iSendResult、outputCounter;
SOCKET listenSocket=无效的\u套接字,clientSocket=无效的\u套接字;
服务器、客户端中的结构sockaddr_;
字符*消息;
char sendbuf[默认值];
无符号字符recvbuf[默认值];
int recvbuflen=默认值;
printf(“\n初始化Winsock…”);
if(WSAStartup(MAKEWORD(2,2),&wsa)!=无错误)
{
printf(“失败。错误代码:%d”,WSAGetLastError());
返回1;
}
printf(“已初始化。\n”);
如果((listenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==无效的\u socket)//IPv4,TCP
{
printf(“无法创建套接字:%d”,WSAGetLastError());
WSACleanup();
返回1;
}
printf(“已创建套接字。\n”);
memset(&server,'0',sizeof(server));
memset(sendbuf,'0',sizeof(sendbuf));
server.sinu family=AF\u INET;
//server.sin_addr.s_addr=htonl(0x7F000001);//localhost-127.0.0.1
server.sin_addr.s_addr=inet_addr(“127.0.0.1”);
//server.sin_addr.s_addr=inet_addr(“10.48.53.166”);
server.sin_port=htons(7368);
if(bind(listenSocket,(struct sockaddr*)&server,sizeof(server))==SOCKET\u错误)
{
printf(“绑定失败,错误代码:%d”,WSAGetLastError());
闭合插座(listenSocket);
WSACleanup();
返回1;
}
看跌期权(“绑定完成”);
听(listenSocket,10);
//接受和传入连接
puts(“等待传入连接…”);
c=sizeof(结构sockaddr_in);
message=“{\'id\':2,\'result\':{\'code\':\'999\',\'message\':\'AddPageRange StartIndex与检查计数器不匹配\',\'Client\'u id\':\'PQCS1\',\'jsonrpc\':'2.0\',\'Protocol\':'2H\';
而((clientSocket=accept(listenSocket,(struct sockaddr*)NULL,NULL))!=INVALID_SOCKET)
{
看跌期权(“已接受连接”);
做{
iResult=recv(clientSocket,recvbuf,recvbuflen,0);
如果(iResult>0)
{
printf(“收到的字节数:%d\n”,iResult);
recvbuf[iResult]='\0';
输出计数器=0;
而(recvbuf[outputCounter]!='\0')
printf(“%X”,(无符号字符)recvbuf[outputCounter++];
iSendResult=send(客户端套接字,消息,strlen(消息),0);
if(iSendResult==套接字错误)
{
printf(“发送失败,错误:%d\n”,WSAGetLastError());
闭合插座(clientSocket);
WSACleanup();
返回1;
}
printf(“发送的字节数:%d\n”,iSendResult);
}
else if(iResult==0)
printf(“连接关闭\n”);
其他的
printf(“recv失败:%d\n”,WSAGetLastError());
}而(iResult>0);
}
if(clientSocket==无效的_SOCKET)
{
printf(“接受失败,错误代码:%d”,WSAGetLastError());
返回1;
}
闭合插座(listenSocket);
WSACleanup();
返回0;
}
您的recvbuf类型为char,怀疑您的平台上有签名。消息的两个字节都大于127(十进制),因此被视为负数。printf(“%X”)格式说明符需要一个整数(从外观上看,在您的平台上是32位),因此该数字会得到符号扩展(用字节的最高有效位填充整数的最高有效24位)
请尝试打印您收到的字节数。同时将printf更改为
printf("%X", ((int)recvbuf[outputCounter++]) & 0xff);
您的
printf
有问题
看着
o,u,x,x
无符号int参数转换为无符号八进制(o)、无符号十进制(u)或无符号十六进制(x和x)表示法。字母abcdef用于x转换;字母ABCDEF用于X转换。精度(如有)给出了必须出现的最小位数;如果转换后的值需要更少的数字,则在左侧用零填充。默认精度为1。当以显式精度0打印0时,输出为空
重点矿山
因此,使用%X
作为格式说明符,您的数据将升级为无符号整数
,您必须通过它,只选择要打印的字节:
printf("Byte %d: %X\n", outputCounter, recvbuf[outputCounter++] & 0xFF);
对于
sendbuf[]
和recvbuf[]
,最好使用unsigned char
而不是char
。将有符号值转换为无符号值有点复杂。一个更简单的解决方案可以是printf(“%X”,(无符号字符)recvbuf[outputCounter++]
或声明无符号字符recvbuf[DEFAULT_BUFLEN]代码>。我试图将recvbuf的类型更改为unsigned char,但问题是方法recv()不接受此参数的unsigned char。我得到一个编译错误:“无法将参数2从无符号字符[512]转换为字符*”@user2963830的第二个参数是void*
。它接受所有指针。所以你可能写了一些不好的东西。将修改后的代码添加到帖子中。因此我在上面添加了修改后的代码。我使用visual studio,编辑器告诉我Methods签名是:int_stdcall recv(sockets s,char*buf,int len,int flags)…很好,有时有人会记得我为什么