首页 > 解决方案 > 服务器挂在 UDP 套接字的 recvfrom() 上(C,Windows)

问题描述

我正在尝试从我的客户端接收一些数据,而我的服务器在遇到 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);
}

标签: cwindowssocketsudpip

解决方案


推荐阅读