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

如何解决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(将#修改为@)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?