服务器挂在 recvfrom() 上用于 UDP 套接字(C、Windows)

时间:2021-02-26 01:23:01

标签: c windows sockets udp ip

我正在尝试从我的客户端接收一些数据,但我的服务器在遇到 recvfrom() 函数时似乎挂起。我不知道出了什么问题,或者我的套接字设置是否有问题。我也用 Python 对此进行了编码,它运行良好,并且看起来套接字的设置相同。下面是有问题的完整代码,底部发生挂起。我是 C 的新手,因此对于任何混淆或白痴,我深表歉意。非常感谢您提供任何帮助。

#define _WINSOCK_DEPRECATED_NO_WARNINGS

#define WIN32_LEAN_AND_MEAN

#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#include <winsock2.h>
#include <Ws2tcpip.h>
#include < ws2ipdef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define PORT       25678
#define STREAM    "235.5.4.5"

int main(int argc, char* argv[]) {
    int sockfd;
    struct sockaddr_in sin, group;

    int sin_len, done;
    const int buffer_len = 1024;
    char buffer[1024];
    
    WSADATA wsaData;
    printf("Initializing the winsock library  ...  ");
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) == SOCKET_ERROR) {
        return -1;
    }

    memset(&sin, 0, sizeof(sin));

    //1 create a socket
    printf("Creating a socket                 ...  ");
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) { perror("Error opening socket");  exit(1); }

    //2 set generic socket options
    u_int share;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &share, sizeof(share)) < 0) {
        perror("setsockopt");  exit(1);
    }

    //3 bind the socket to the port
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);

    sin_len = sizeof(sin);
    if (bind(sockfd, (struct sockaddr*)&sin, sin_len) < 0) {
        exit(1);
    };

    //4 set up mreq
    group.sin_family = AF_INET;
    group.sin_port = htons(PORT);
    group.sin_addr.s_addr = inet_addr(STREAM);

    struct ip_mreq mreq;

    mreq.imr_multiaddr = group.sin_addr;
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);

    //5 set the socket options to the mreq
    if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
        printf("ERROR adding membership");
        exit(1);
    }

    done = 0;
    int nb;
    //6 listen
    while (!done) {
        //int recvfrom(int socket, char *buf, int buflen, int flags, struct sockaddr* addr, int* addrlen);
        nb = recvfrom(sockfd, (char*)buffer, buffer_len, 0, (struct sockaddr*)&sin, &sin_len);
    }
    close(sockfd);
    return(0);
}

0 个答案:

没有答案
相关问题