异步udp服务器客户端应用程序

时间:2013-04-16 09:59:42

标签: c sockets udp

我正在尝试创建一个异步UDP聊天应用程序,目前只有一个客户端和服务器。

运行服务器时,会显示大量冗余数据。之后,当输入一些文本时,

  

发送文件时出错!

显示。

有人可以查看代码并让我知道我哪里出错了吗?

服务器:
    u_long iMode = 1;     ioctlsocket(SD,FIONBIO,&安培;的iMode);     int n = sd + 1;

fd_set readfds,writefds;
while(1)
{
    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
    FD_SET(sd,&readfds);
    FD_SET(sd,&writefds);

    int rv = select(n, &readfds, &writefds, NULL, NULL);
    if(rv==-1)
    {
        printf("Error in Select!!!\n");
        exit(0);
    }
    if(rv==0)
    {
        printf("Timeout occurred\n");
    }
    if (FD_ISSET(sd, &readfds))
    {
        FD_CLR(sd,&readfds);
        int client_length = (int)sizeof(struct sockaddr_in);
        memset(&buffer,0,sizeof(buffer));
        int bytes_received = recvfrom(sd, buffer,SIZE, 0, (struct sockaddr *)&client, &client_length);
        if (bytes_received < 0)
        {
            fprintf(stderr, "Could not receive datagram.\n");
            closesocket(sd);
            WSACleanup();
            exit(0);
        }
    }

    printf("\nClient says: %s",buffer);
    printf("\nWrite :");

    fgets(buffer,SIZE,stdin);
    if(FD_ISSET(sd,&writefds))
    {
        FD_CLR(sd,&writefds);
        int client_length = (int)sizeof(struct sockaddr_in);
        if(sendto(sd, buffer,strlen(buffer), 0, (struct sockaddr *) &client,client_length)<0)
        {
            printf("Error sending the file! \n");
            exit(1);
        }
    }
}
closesocket(sd);
WSACleanup();

return 0;
}

1 个答案:

答案 0 :(得分:1)

我发现了一个问题。这一行:

int rv = select(n, &readfds, &writefds, NULL, NULL);

将几乎总是立即返回readfds为空。但是writefds将几乎始终设置为“sd”套接字,表明它已准备好写入/发送。

因此,您的代码正确地跳过了调用recvfrom()的尝试,但没有任何东西阻止它进入发送代码路径。所有变量如client,client_length和buffer都可能在此时未初始化。或者更糟糕的是,缓冲区和客户端正是它们在循环中最后一次成功调用时的情况。这可能解释了冗余数据。

我的建议是根本不在select call中设置“writefds”。实际阅读时只能“发送”。无论如何,sendto呼叫不会阻止任何大量的时间。