Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的IPv6服务器-recvfrom失败_C_Server_Ipv6_Winsock2_Recvfrom - Fatal编程技术网

c中的IPv6服务器-recvfrom失败

c中的IPv6服务器-recvfrom失败,c,server,ipv6,winsock2,recvfrom,C,Server,Ipv6,Winsock2,Recvfrom,我已经用winsock2.h为IPv6服务器编写了一个小型c程序。当我在Visual Studio中运行该程序时,我一直收到以下消息:recvfrom失败 我只是在recvfrom函数中找不到错误。也许有人能理解为什么我的程序在这一点上不起作用,谢谢!:-) 致以最良好的祝愿, 肯 #定义WIN32_LEAN_和_MEAN #包括 #包括 #包括 #包括 #包括 #pragma注释(lib,“Ws2_32.lib”) int main(int argc,char*argv[]){ 套接字服务器(

我已经用winsock2.h为IPv6服务器编写了一个小型c程序。当我在Visual Studio中运行该程序时,我一直收到以下消息:recvfrom失败

我只是在recvfrom函数中找不到错误。也许有人能理解为什么我的程序在这一点上不起作用,谢谢!:-)

致以最良好的祝愿, 肯

#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
int main(int argc,char*argv[]){
套接字服务器(SOCKET),;
6服务器地址、客户端地址中的结构sockaddr\u;
socklen_u t client_len;
char-buf[1024];
char-clientIP[256];
WSADATA数据;
WORD版本=MAKEWORD(2,2);
if(WSAStartup(版本和数据)=套接字错误){
printf(“WSASStartup失败\n”);
WSACleanup();
退出(退出失败);
}
服务器插槽=插槽(AF INET6,插槽内存,0);
如果(服务器_套接字==-1){
printf(“创建套接字失败\n”);
WSACleanup();
退出(退出失败);
}
否则{
printf(“创建套接字成功\n”);
}
memset(&server_addr,0,sizeof(server_addr));
server\u addr.sin6\u addr=in6addr\u any;
服务器地址sin6家庭=AF\U INET6;
服务器地址sin6\u端口=htons(5001);
if(bind(server\u socket,(const struct sockaddr*)和server\u addr,
sizeof(服务器地址))=-1){
printf(“绑定套接字失败\n”);
WSACleanup();
退出(退出失败);
}
否则{
printf(“绑定套接字成功\n”);
}
而(1){
memset(&client_addr,0,sizeof(client_addr));
memset(buf,0,sizeof(buf));
if(recvfrom(server_socket,char*)buf,1024,0,
(结构sockaddr*)和客户端地址,
sizeof(客户地址)=-1){
printf(“recvfrom失败\n”);
WSACleanup();
退出(退出失败);
}
否则{
printf(“接收成功”);
}
printf(“%s\n”,buf);
printf(“IP:%s\n”、inet\u ntop(AF\u INET6和client\u addr.sin6\u addr、,
clientIP,256);
}
closesocket(服务器_套接字);
WSACleanup();
返回0;
}

您误用了
recvfrom()
fromlen
参数期望接收指向
int
int*
指针,该指针在输入时指定在
from
参数中传递的
sockaddr
缓冲区的字节大小,在输出时,接收从缓冲区写入
sockaddr
的字节大小

您的代码中还有其他一些小错误:

  • WSAStartup()
    不会返回
    SOCKET\u错误
    如果出现故障,它会返回实际的错误代码

  • 您忽略了
    recvfrom()
    的返回值,它告诉您实际写入
    buf
    的字节数。您假设在将
    buf
    传递给
    printf(“%s”)
    时,它总是以null结尾,但这并不能保证。您正在调零
    buf
    以使用空终止符对其进行初始化,如果
    recvfrom()
    接收到包含少于1024个字节的数据报,则可以使用空终止符对其进行初始化。但是如果它接收到的数据报正好是1024字节,那么所有的空终止符都将被覆盖,并且没有剩余的终止符供
    printf()
    查找(if
    recvfrom())
    接收超过1024字节的数据报时,它将失败并出现
    WSAEMSGSIZE
    错误,这不是致命错误,但您将其视为致命错误)。您可以将缓冲区大小的返回值
    recvfrom()
    传递到
    printf()
    ,而不必依赖任何空终止符。无需浪费开销,将
    recvfrom()
    将覆盖的内容归零

请尝试以下方法:

#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
int main(int argc,char*argv[]){
套接字服务器(SOCKET),;
6服务器地址、客户端地址中的结构sockaddr\u;
int client_len,num_recvd;
char-buf[1024];
char-clientIP[256];
WSADATA数据;
WORD版本=MAKEWORD(2,2);
int errCode=WSAStartup(版本和数据);
如果(错误代码!=0){
printf(“WSAStartup失败,错误%d\n”,错误代码);
WSACleanup();
返回退出失败;
}
服务器插槽=插槽(AF INET6、插槽内存、IP协议UDP);
if(服务器\u套接字==无效的\u套接字){
errCode=WSAGetLastError();
printf(“创建套接字失败,错误%d\n”,错误代码);
WSACleanup();
返回退出失败;
}
printf(“创建套接字成功\n”);
memset(&server_addr,0,sizeof(server_addr));
server\u addr.sin6\u addr=in6addr\u any;
服务器地址sin6家庭=AF\U INET6;
服务器地址sin6\u端口=htons(5001);
if(bind(server\u socket,(struct sockaddr*)和server\u addr,sizeof(server\u addr))==socket\u错误){
errCode=WSAGetLastError();
printf(“绑定套接字失败,错误%d\n”,错误代码);
closesocket(服务器_套接字);
WSACleanup();
返回退出失败;
}
printf(“绑定套接字成功\n”);
而(1){
客户地址=sizeof(客户地址);
num_recvd=recvfrom(服务器套接字、buf、sizeof(buf)、0、(结构sockaddr*)和客户端地址以及客户端地址);
if(num_recvd==套接字错误){
errCode=WSAGetLastError();
if(errCode!=WSAEMSGSIZE){
printf(“recvfrom失败,错误%d\n”,错误代码);
closesocket(服务器_套接字);
WSACleanup();
返回退出失败;
}
printf(“recvfrom截断了大于%u字节的数据报!\n”,sizeof(buf));
num_recvd=sizeof(buf);
}
否则{
printf(“recvfrom successful\n”);
}
printf(“%s\n”,num_recvd,buf);
printf(“IP:%s\
#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

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

    SOCKET server_socket;
    struct sockaddr_in6 server_addr, client_addr;
    socklen_t client_len;
    char buf[1024];
    char clientIP[256];

    WSADATA data;
    WORD version = MAKEWORD(2, 2);
    if (WSAStartup(version, &data) == SOCKET_ERROR) {

        printf("WSASStartup failed\n");
        WSACleanup();
        exit(EXIT_FAILURE);
    }

    server_socket = socket(AF_INET6, SOCK_DGRAM, 0);
    if (server_socket == -1) {

        printf("creating socket failed\n");
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    else {

        printf("creating socket successful\n");
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin6_addr = in6addr_any;
    server_addr.sin6_family = AF_INET6;
    server_addr.sin6_port = htons(5001);

    if (bind(server_socket, (const struct sockaddr*) & server_addr,
        sizeof(server_addr)) == -1) {

        printf("bind socket failed\n");
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    else {

        printf("bind socket successful\n");
    }

    while (1) {

        memset(&client_addr, 0, sizeof(client_addr));
        memset(buf, 0, sizeof(buf));

        if (recvfrom(server_socket, (char*)buf, 1024, 0,
            (struct sockaddr*) & client_addr,
            sizeof(client_addr)) == -1) {

            printf("recvfrom failed\n");
            WSACleanup();
            exit(EXIT_FAILURE);
        }
        else {

            printf("recvfrom successful");
        }

        printf("%s\n", buf);
        printf("IP: %s\n", inet_ntop(AF_INET6, &client_addr.sin6_addr,
            clientIP, 256));
    }

    closesocket(server_socket);

    WSACleanup();

    return 0;
}