2011-01-30 7 views
0

내가 send()를 사용하여 배열을 보내려고 오전 :보내기 배열

char* packet = new char[3]; 
packet[0] = 0; 
packet[1] = 1; 
packet[2] = 2; 

를 그리고 난 이런 식으로 인쇄하려고 :

char temp[3]; Recv(temp, 3); 
for(unsigned int i = 0; i < 3; i++) { 
    cout << temp[i] << endl; 
} 

그러나 나는 단지이 개 이상한 문자를 얻을 수 화면. 무엇이 문제 일 수 있습니까? 나는 send(packet, 3)을 사용합니다.

서버 코드 :

class Server { 
    WSAData wsadata; 
    int desc; 
    int remoteSocket; 
    SOCKADDR_IN server; 
public: 
    Server() { 
     if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0) 
     { 
      cout << "Error creating socket" << endl; 
      exit(1); 
     } 
     wsadata.wVersion = 5; 
    } 
    ~Server() { 
     WSACleanup(); 
    } 
    void Initialize() { 
     memset(&server, 0, sizeof(server)); 

     server.sin_family = AF_INET; 
     server.sin_addr.s_addr = INADDR_ANY; // Where to start server? 
     server.sin_port = htons(9898); // Port 
    } 
    void Socket() { 
     desc = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
     if (desc == -1) { 
      cout << "Error in Socket()" << endl; 
     } 
    } 
    void Bind() { 
     if ((::bind(desc, (LPSOCKADDR)&server, sizeof(server))) == -1) { 
      cout << "Error in Bind()" << endl; 
     } 
    } 
    void Listen() { 
     if ((::listen(desc, 5)) == -1) { 
      cout << "Error in Listen()" << endl; 
     } 
    } 
    void Accept() { 
     SOCKADDR_IN sock; 
     int intsock = sizeof(sock); 
     remoteSocket = ::accept(desc, (LPSOCKADDR)&sock, &intsock); 
     if (remoteSocket == -1) { 
      cout << "Error in Accept()" << endl; 
     } 
     HandleConnection(); 
    } 
    void HandleConnection() { 
     cout << "You are connected !!!" << endl; 
     char temp[3]; 
     Recv(temp, 3); 
     for(unsigned int i = 0; i < 3; i++) { 
      if (temp[i] == '2') 
       cout << "I got a 2"; 
     } 
    } 
    void Send(const char* buffer, int size) { 
     if ((::send(remoteSocket, buffer, size, 0)) < 0) { 
      cout << "Error in Send()" << endl; 
     } 
    } 
    void Recv(char* buffer, size_t size) { 
     size_t n = 0; 
     n = ::recv(remoteSocket, buffer, size, 0); 
    } 

}; 

int main() { 
    Server s; 
    s.Initialize(); 
    s.Socket(); 
    s.Bind(); 
    s.Listen(); 
    while(1) { 
     s.Accept(); 
    } 
    return 0; 
} 

클라이언트 코드 : 당신이 문자를 인쇄 할 양재를 사용하는 경우

class Client { 
    int desc; 
    SOCKADDR_IN client; 
    WSAData wsadata; 
public: 
    Client() { 
     if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0) { 
      cout << "Error creating socket" << endl; 
      exit(1); 
     } 
     wsadata.wVersion = 5; 
    } 
    ~Client() { 
     WSACleanup(); 
    } 
    void Initialize() { 
     memset(&client, 0, sizeof(client)); 
     client.sin_family = AF_INET; 
     client.sin_addr.s_addr = inet_addr("127.0.0.1"); 
     client.sin_port = htons(9898); 
    } 
    void Socket() { 
     desc = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
     if (desc == -1) { 
      cout << "Error in Socket()" << endl; 
     } 
    } 
    void Connect() { 
     if ((::connect(desc, (LPSOCKADDR)&client, sizeof(client))) > 0) { 
      cout << "Error in Connect()" << endl; 
     } 
    } 
    void Send(const char* buffer, int size) { 
     int n; 
     if ((n = ::send(desc, buffer, size, 0)) < 0) { 
      cout << "Error in Send()" << endl; 
     } 
    } 
    void Recv(char* buffer, size_t size) { 
     size_t n = 0; 
     n = ::recv(desc, buffer, size, 0); 
     cout << n; 
    } 
}; 

int main() { 
    Client c; 
    c.Initialize(); 
    c.Socket(); 
    c.Connect(); 
    char packet[3]; 
    packet[0] = '0'; 
    packet[1] = '1'; 
    packet[2] = '2'; 
    c.Send(packet, 3); 
    return 0; 
} 
+2

더 많은 코드를 게시하십시오. 어떻게 데이터를 보내십니까? – Nawaz

+0

이전에이 질문을 하셨는데 해결해 보셨습니까? – Marlon

+0

@Marlon : 우리는 문자열로 해결했습니다. 배열로는 작동하지 않았지만, 제 실수는 제가 문자들처럼 그들을 보내지 않았다는 것입니다. – Kobe

답변

3

, 그것은 숫자 값을 문자로 처리하고 아니에요. 낮은 차수의 ASCII 값인 0, 1 및 2를 전송 했으므로 시스템은 원하는 모든 글리프로 렌더링하거나 전혀 렌더링하지 않을 수 있습니다. 이 경우 문자가 영 (0은 표시되지 않음)과 가비지 문자 (다른 두 문자는 null 문자)로 매핑된다는 것을 알 수 있습니다.

이 문제를 해결하려면 문자를 인쇄 할 수 있도록 int로 출력하십시오. 그것은 당신이 찾고있는 숫자 값을 제공해야합니다.

+0

+1, 저를 때려주십시오. –

+0

고마워, 지금 작동 – Kobe

+1

그 대답은 허용 된 것으로 표시해야합니다.이 경우 –

1

화면에 1 2 3을 인쇄하고 싶습니다. 그렇다면 다음을 수행해야합니다.

packet[0] = '0'; //note the single quote! 
packet[1] = '1'; 
packet[2] = '2'; 

차이점을 확인 했습니까?

+1

감사합니다. 올바른 경우 – Kobe

+0

출력이 올바르게 표시되지만 전송되는 데이터는 변경됩니다. – Marlon

+0

하지만 대신에 if()를 사용하여 값을 테스트하십시오 : if (temp [i] == '2') cout << "2가 있습니다." 섬기는 사람? – Kobe