2009-09-26 20 views
0

J'ai un programme python qui fonctionne parfaitement pour le chat sur internet. Mais le programme construit sur des sockets similaires en C++ ne fonctionne pas sur internet.
programme PythonProgramme de socket Python vs C++ (Winsock)

import thread 
import socket 


class p2p: 
    def __init__(self): 
     socket.setdefaulttimeout(50) 
     self.port = 3000 

     #Destination IP HERE 
     self.peerId = '59.95.18.156' 

     #declaring sender socket 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM ) 
     self.socket.bind(('', self.port)) 
     self.socket.settimeout(50) 

     #starting thread for reception 
     thread.start_new_thread(self.receiveData,()) 

     while 1: 
      data=raw_input('>') 
      #print 'sending...'+data 
      self.sendData(data) 

    def receiveData(self): 
     while 1: 
      data,address=self.socket.recvfrom(1024) 
      print data 
    def sendData(self,data): 
     self.socket.sendto(data, (self.peerId,self.port)) 
if __name__=='__main__': 
    print 'Started......'  
    p2p() 

Je veux construire des fonctionnalités similaires en C++. J'ai pris des programmes de serveur et de client de MSDN. Mais ils ne travaillent que sur localhost pas sur Internet .. ils sont les suivants ...

Auteur

#include <stdio.h> 
#include "winsock2.h" 

void main() { 

    WSADATA wsaData; 
    SOCKET SendSocket; 
    sockaddr_in RecvAddr; 
    int Port = 3000; 
    char SendBuf[3]={'a','2','\0'}; 
    int BufLen = 3; 

    //--------------------------------------------- 
    // Initialize Winsock 
    WSAStartup(MAKEWORD(2,2), &wsaData); 

    //--------------------------------------------- 
    // Create a socket for sending data 
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    //--------------------------------------------- 
    // Set up the RecvAddr structure with the IP address of 
    // the receiver (in this example case "123.456.789.1") 
    // and the specified port number. 
    RecvAddr.sin_family = AF_INET; 
    RecvAddr.sin_port = htons(Port); 
    RecvAddr.sin_addr.s_addr = inet_addr("59.95.18.156"); 

    //--------------------------------------------- 
    // Send a datagram to the receiver 
    printf("Sending a datagram to the receiver...\n"); 
    sendto(SendSocket, 
    SendBuf, 
    BufLen, 
    0, 
    (SOCKADDR *) &RecvAddr, 
    sizeof(RecvAddr)); 

    //--------------------------------------------- 
    // When the application is finished sending, close the socket. 
    printf("Finished sending. Closing socket.\n"); 
    closesocket(SendSocket); 

    //--------------------------------------------- 
    // Clean up and quit. 
    printf("Exiting.\n"); 
    WSACleanup(); 
    return; 
} 

Récepteur

#include <stdio.h> 
#include "winsock2.h" 
#include<iostream> 
using namespace std; 
void main() { 

    WSADATA wsaData; 
    SOCKET RecvSocket; 
    sockaddr_in RecvAddr; 
    int Port = 3000; 
    char RecvBuf[3]; 
    int BufLen = 3; 
    sockaddr_in SenderAddr; 
    int SenderAddrSize = sizeof(SenderAddr); 

    //----------------------------------------------- 
    // Initialize Winsock 
    WSAStartup(MAKEWORD(2,2), &wsaData); 

    //----------------------------------------------- 
    // Create a receiver socket to receive datagrams 
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    //----------------------------------------------- 
    // Bind the socket to any address and the specified port. 
    RecvAddr.sin_family = AF_INET; 
    RecvAddr.sin_port = htons(Port); 
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); 

    bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr)); 

    //----------------------------------------------- 
    // Call the recvfrom function to receive datagrams 
    // on the bound socket. 
    printf("Receiving datagrams...\n"); 
    while(true){ 
    recvfrom(RecvSocket, 
    RecvBuf, 
    BufLen, 
    0, 
    (SOCKADDR *)&SenderAddr, 
    &SenderAddrSize); 
    cout<<RecvBuf; 
    } 
    //----------------------------------------------- 
    // Close the socket when finished receiving datagrams 
    printf("Finished receiving. Closing socket.\n"); 
    closesocket(RecvSocket); 

    //----------------------------------------------- 
    // Clean up and exit. 
    printf("Exiting.\n"); 
    WSACleanup(); 
    return; 
} 

Merci pour toute aide ..

Désolé pour trop de code dans la question.

Répondre

1

par the docs, sendto retourne un nombre qui est> 0 (nombre d'octets envoyés) pour le succès, < 0 pour l'échec, et dans ce dernier cas, vous utilisez WSAGetLastError pour plus d'informations. Essayez donc d'enregistrer le résultat sendto, de l'imprimer (ainsi que la taille des données que vous essayez d'envoyer) et, en cas d'erreur, d'imprimer le code de la dernière erreur. Que voyez-vous alors?

Questions connexes