0

私は C++ が初めてで、単純な UDP サーバーのセットアップに問題があります。コードでやりたいことは、メッセージを受信して​​コンソールに出力することだけです。

多くの調査の結果、ソケットを正しく機能させるには WSAStartup を使用する必要があることがわかりましたが、それがどのように機能し、どこに WSACleanup を配置すればよいかわかりません。ソケットの作成後に WSACleanup を配置すると、「バインド」メソッドの実行時にコンソールにエラー コード「10093」が返されます。クリーンアップを使用しない場合、プログラムが実行され、コンソールには何も表示されません。

デバッグ モードでコードを調べたところ、テスト UDP Java クライアントを使用してメッセージを送信するまで、「recvfrom」行でハングするため、コードが正常に実行されているように見えることがわかりました。コンソールに何も出力されないのはなぜか、または何か不足しているのではないかと思っています。

どんな助けでも大歓迎です。IDE と MinGW コンパイラにも netbeans を使用しています。

これが私のコードです:

#include <stdio.h>
#include <windows.h> 
#include <winsock2.h>
#include <ws2tcpip.h>

#define PORT 9760
#define BUFSIZE 1024

void startup()
{  
    WORD wVersionRequested;
    WSADATA wsaData;
    int start;

    wVersionRequested = MAKEWORD(2, 2);
    start = WSAStartup(wVersionRequested, &wsaData);

    if(start!=0){
        printf("This version is not supported! - %d \n", WSAGetLastError());
    }
    else{
        printf("Good - Everything fine!\n");
    }
}

void Server()
{    
    startup();

    struct sockaddr_in myaddr;      
    struct sockaddr_in remaddr;     
    socklen_t addrlen = sizeof(remaddr); 
    int recvlen;     
    SOCKET fd;  
    char buf[BUFSIZE];  


    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("cannot create socket\n");
        return;
    }
    else {
        printf("socket created \n");        
    }

    memset((char *)&myaddr, 0, sizeof(myaddr));
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    myaddr.sin_port = htons(PORT);

    int bindVal = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));

    if (bindVal < 0) {
        printf("socket error: %d, %s \n", errno, strerror(errno));
        perror("bind failed");
        printf("bind wsaerr: %d \n", WSAGetLastError());
        WSACleanup();

        return;
    }

    for (;;) {
        //printf("waiting on port %d\n", PORT);
        recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
        //printf("received %d bytes\n", recvlen);
        if (recvlen > 0) {
            buf[recvlen] = 0;
            printf("received message: \"%s\"\n", buf);
        }

        //WSACleanup();
    }

}

int main(int argc, char** argv) {

    Server();

    WSACleanup();

    return 0;
}
4

0 に答える 0