C - 了解客户端/服务器聊天 ioctl-function

问题描述

在大学里,我们的任务是编写一个聊天服务器(IPv6)和一个客户端。它已经工作了,但我有一个问题,即一侧(服务器,客户端)不能一个一个地发送多条消息,因为例如,服务器必须先接收客户端消息才能发送。我们的教授告诉我们使用 select() 和 ioctl() 函数解决这个问题,但我不明白这应该如何工作。我必须以什么顺序使用 select()、ioctl() 等?

在我的理解中,select() 会一直监听套接字。一旦客户端发送消息,就会触发选择。但是当gets-function正在等待输入并阻止程序时它不起作用。谢谢你的建议! PS:不允许穿线

服务器代码

while (1) {

    FD_ZERO(&fdSet); //fdSet is an Array of Sockets - FD_Zero initalizes them with 0
    FD_SET(ListenSocket,&fdSet); //add the socket which listens and awaits connections from client

        if (client != INVALID_SOCKET) {
            FD_SET(client,&fdSet); // Add client socket also
        }


        //wait for something to happen on any of the sockets in fdSet,last parameter indicates the timeout (NULL means wait indefinitely)
        iResult = select(0,&fdSet,NULL,NULL);
        if (iResult == SOCKET_ERROR) {
            printf("Error on select.\n");
            exit(1);
        }


    
        //check,if ListenSocket is in fdSet (fdSet is an Array of Sockets)
        if (FD_ISSET(ListenSocket,&fdSet)) {
            if (client == INVALID_SOCKET) {
                client = accept(ListenSocket,NULL);
                printf("New client connection accepted.\n");
                //break;
            }
        }

        if (FD_ISSET(client,&fdSet)) {
            iResult = recv(client,&message_cli,sizeof(message_cli),0); //read the incoming message from the client
            //if recv returns 0,the client has closed the connection
            if (iResult == 0 || iResult == SOCKET_ERROR) {
                printf("Client %d has disconnected\n",client);
                closesocket(client); //close the socket   
                client = INVALID_SOCKET; //make room for new clients
            }
            else {
                //add null character to printf message in buffer

                printf("%s > %s\n",&message_cli.sNumber,&message_cli.txt);
                printf("%s > ",&message_serv.sNumber);
                gets(&message_serv.txt);



                iResult = send(client,&message_serv,sizeof(message_serv),0);
                if (iResult == SOCKET_ERROR) {
                    printf("Send Failed: %d\n",WSAGetLastError());
                    closesocket(client);
                    WSACleanup();
                    exit(1);


                }


            }

客户端代码

  while (1) {
       
        printf("%s> ",&message_cli.sNumber);
        gets(&message_cli.txt);


      

        iResult = send(ClientSocket,0);
        if (iResult == 0 || iResult == SOCKET_ERROR) {
            printf("Server has disconnected.\n");
            closesocket(ClientSocket);
            WSACleanup();
            exit(1);
        }


        iResult = recv(ClientSocket,0);
                if (iResult > 0) {
     
                    printf("%s> %s\n",&message_serv.sNumber,&message_serv.txt);
            
                }
      
    }
    closesocket(ClientSocket);
    WSACleanup();
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)