될 나는 다음과 같은 문제가 있습니다C-서버 소켓이 잘못 패킷
- 내가 문자열을 보낼 아파치 미나 프레임 워크를 사용하여 자바 클라이언트가 있습니다.
- 문자열을 수신 할 C 서버를 작성했습니다.
- 그래서, 서버에 UTF8 문자를 보내려고 : myStringToSend = "A"
- 내가 아니라 문자열을 변환 바이트 또는 16 진수와 미나의 패킷을 볼 수있는 미나 소스를 디버깅, 그것은
0xC3
0x84
을 보내도록 . - 또한 wireshark 네트워크 뷰어에서 보낸 패킷을 확인하고 패킷으로 모두
0xC3
0x84
을 참조하십시오. - 하지만 내 C-서버는 다음 바이트가 나타납니다
FFFFFFC3FFFFFF84
내가 잘못 무슨 일이 일어나고 있는지 모르겠어요?
내 C-서버의 코드 :
#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;
}
'char' 대신'unsigned char'을 사용하는 것이 좋습니다. 'sendbuf []'와'recvbuf []'둘 다. –