簡體   English   中英

無法使用UDP套接字c ++進行偵聽

[英]Unable to listen with UDP socket c++

我正在嘗試為服務器c ++文件實現UDP套接字。 我有以下代碼來設置套接字

//Create the server socket
    if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
        throw "can't initialize socket";


    //Fill-in Server Port and Address info.
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);


    //Bind the server port

    if (bind(s, (LPSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
        throw "can't bind the socket";
    cout << "Bind was successful" << endl;

    //Successfull bind, now listen for client requests.

    if (listen(s, 10) == SOCKET_ERROR)
        throw "couldn't  set up listen on socket";
    else cout << "Listen was successful" << endl
            << "Waiting to be contacted for transferring files..." << endl;

運行此代碼時,我會到達最后一個if語句並發生一個SOCKET_ERROR,它會拋出“無法設置偵聽套接字”。 當我將其作為TCP連接時(如下所示),所有設置都正確:

 if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
        throw "can't initialize socket";

將SOCK_STREAM更改為SOCK_DGRAM會給我這個錯誤。 有誰知道這里可能出現什么問題?

您無法偵聽UDP套接字。 查看文檔:

sockfd參數是一個文件描述符,它引用SOCK_STREAM或SOCK_SEQPACKET類型的套接字。

正如其他人所說,你不使用UDP listen() (或accept() )。 調用bind() ,只需啟動調用recvfrom()即可接收UDP數據包。

if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)對於設置UDP套接字是正確的

要使用UDP套接字接收數據,您需要使用recvfrom()

例:

// setup 
char RecvBuf[1024];
int BufLen = 1024;
sockaddr_in SenderAddr;
int SenderAddrSize = sizeof (SenderAddr);
// ........ 
if (recvfrom(s, RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize) == SOCKET_ERROR) {..}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM