【问题标题】:make server to receieve/send data from/to a client several times(morethan once) in C使服务器在C中多次(不止一次)从/向客户端接收/发送数据
【发布时间】:2012-03-06 23:14:09
【问题描述】:

我已经制作了一个客户端和服务器应用程序。因为当我向服务器发送数据时,服务器正在接收数据,但是服务器进入阻塞状态(等待recv数据仍然从客户端完成数据发送)然后我强制需要关闭套接字形式发送数据。我不想要。

那么谁能告诉我如何告诉服务器我的数据传输完成了。

我的服务器表现如下:

CLIENT: hi //现在强制关闭套接字,否则服务器 进入阻塞状态 服务器:嗨//这之后什么都不能 由于套接字关闭而转移

我想要的地方如下:

客户:嗨
服务器:嗨
客户:你好吗?
服务员:我很好,谢谢!
服务员:你呢?
客户:我也很好,谢谢。

【问题讨论】:

  • 删除第 42 行中的 fork() 调用。
  • 你使用的是 UDP、TCP、SCTP 哪个协议?

标签: c


【解决方案1】:

除了将套接字设置为非阻塞之外,如果这样更容易,您需要开发自己的协议。该协议将定义客户端/服务器之间的通信。例如,如果您只使用字符串,则可以包含数据大小、数据或只是某种形式的数据分隔符。

【讨论】:

    【解决方案2】:

    查看ioctlsocket 函数(在Windows 上)或fcntl 函数(在Linux 中),特别是将套接字设置为非阻塞。

    fcntl(sock_fd, F_SETFL, O_NONBLOCK);
    

    或者,当第一个线程阻塞读取时,有一个单独的线程来写入套接字。

    更多信息在这里:http://rhoden.id.au/doc/sockets2.html

    【讨论】:

    • 在将套接字设置为非阻塞模式后,套接字返回 SOCKET_ERROR 这对我来说是个问题......
    • @Subrat nayak。我认为您需要查看线程。这些函数的文档会告诉你它会返回一个错误(通常是 E_WOULDBLOCK 之类的东西),在这种情况下你可以再读一遍(你可能想睡一会儿,所以你不要自旋锁)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多