Übersetzen von Netzwerk Prog



  • Kann mir bitte jemand das fogende Programm für Windows funktionsfähig machen? ich kenne mich leider mit Windowsnetzwerk nicht aus. am besten einfach den empfangenen Text mit einer MessageBox ausgeben.

    /*
        ** listener.c -- a datagram sockets "server" demo
        */
    
        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <errno.h>
        #include <string.h>
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
    
        #define MYPORT 4950    // the port users will be connecting to
    
        #define MAXBUFLEN 100
    
        int main(void)
        {
            int sockfd;
            struct sockaddr_in my_addr;    // my address information
            struct sockaddr_in their_addr; // connector's address information
            socklen_t addr_len;
    	int numbytes;
            char buf[MAXBUFLEN];
    
            if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                perror("socket");
                exit(1);
            }
    
            my_addr.sin_family = AF_INET;         // host byte order
            my_addr.sin_port = htons(MYPORT);     // short, network byte order
            my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
            memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
    
            if (bind(sockfd, (struct sockaddr *)&my_addr,
                                                  sizeof(struct sockaddr)) == -1) {
                perror("bind");
                exit(1);
            }
    
            addr_len = sizeof(struct sockaddr);
            if ((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0,
                               (struct sockaddr *)&their_addr, &addr_len)) == -1) {
                perror("recvfrom");
                exit(1);
            }
    	//Das als MessageBox wenn ein Paket empfangen
            printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
            printf("packet is %d bytes long\n",numbytes);
            buf[numbytes] = '\0';
            printf("packet contains \"%s\"\n",buf);
            close(sockfd);
    
            return 0;
        }
    

    Ich hoffe jemand kriegt das hin. Vielen Dank im Voraus



  • Da musste vermutlich gar nich viel ändern.
    Der Socket-Kram ist in "winsock.h" bzw. "winsock2.h" zu finden.
    Und Winsock muss erst noch initialisiert werden (WSAStartup()) und anschließend wieder freigegeben werden (WSACleanup())

    Microsoft hat sich auch mit dem Portieren beschäftigt:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/porting_socket_applications_to_winsock.asp



  • Was muss ich denn WSAStartup() übergeben? was wird mit den zei parametern gemacht?
    Folgelndes steht in der winsock.h:
    int PASCAL WSAStartup(WORD,LPWSADATA);

    Mein Prog sieht jetzt folgendermaßen aus:

    /* 
        ** listener.c -- a datagram sockets "server" demo 
        */ 
    
    #include <iostream>
    #include <stdlib.h>
    #include <winsock.h>
    
        #define MYPORT 4950    // the port users will be connecting to 
    
        #define MAXBUFLEN 100 
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    WSAStartup();
       int sockfd; 
            struct sockaddr_in my_addr;    // my address information 
            struct sockaddr_in their_addr; // connector's address information 
            socklen_t addr_len; 
        int numbytes; 
            char buf[MAXBUFLEN]; 
    
            if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
                perror("socket"); 
                exit(1); 
            } 
    
            my_addr.sin_family = AF_INET;         // host byte order 
            my_addr.sin_port = htons(MYPORT);     // short, network byte order 
            my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP 
            memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct 
    
            if (bind(sockfd, (struct sockaddr *)&my_addr, 
                                                  sizeof(struct sockaddr)) == -1) { 
                perror("bind"); 
                exit(1); 
            } 
    
            addr_len = sizeof(struct sockaddr); 
            if ((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0, 
                               (struct sockaddr *)&their_addr, &addr_len)) == -1) { 
                perror("recvfrom"); 
                exit(1); 
            } 
        //Das als MessageBox wenn ein Paket empfangen 
            printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr)); 
            printf("packet is %d bytes long\n",numbytes); 
            buf[numbytes] = '\0'; 
            printf("packet contains \"%s\"\n",buf); 
            close(sockfd);
            WSACleanup(); 
      system("PAUSE");	
      return 0;
    }
    

    Muss ich noch eine lib einbinden?



  • lib: ws2_32.lib

    WSADATA wsa;
    
    WSAStartup(MAKEWORD(2,0),&wsa);
    

    ..damit forderst du an, das du gerne Winsock Version 2.0 verwenden möchtest und kriegst in der WSADATA-Struktur noch irgendwelchen Kram geliefert, mit dem man z.B. prüfen könnte, ob Version 2.0 auch verfügbar ist..

    Microsoft hat die ganzen Winsock Funktionen auch dokumentiert:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsastartup_2.asp


Anmelden zum Antworten