问题标签 [winsockets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
340 浏览

c++ - 具有接收/发送命令和请求/响应设计的 C++ 服务器

我正在尝试创建一个带有阻塞套接字的服务器(每个新客户端一个新线程)。该线程应该能够从客户端接收命令(并发送回结果)并定期向客户端发送命令(并请求返回结果)。

我的想法是为每个客户端创建两个线程,一个recvsend. 然而:

  1. 它是正常线程开销的两倍。
  2. 由于请求/响应设计,我在第一个线程中执行的recv(等待客户端的命令)可以是我在第二个线程中查找的请求(客户端的结果到我的发送),反之亦然。使所有内容正确同步可能是一个地狱般的故事。所以现在我想用这种方式从一个线程中做到这一点:

在一个循环中:

  1. setsockopt(SO_RCVTIMEO, &small_timeout);//设置recv的超时时间(比如1000毫秒)。
  2. recv();// 首先检查客户端的请求。如果返回 WSAETIMEDOUT 比我假设没有数据被请求并且什么都不做。如果我收到一个正常的请求,我会处理它。
  3. if (clientbufferToSend != nullptr) send(clientbufferToSend);// 现在,当客户端的请求被处理后,我们检查我们必须发送给客户端的命令列表。如果队列中有命令,我们发送它们。SO_SNDTIMEO 超时可以设置为一个很大的值,这样如果客户端失去连接我们就不会死锁。
    1. setsockopt(SO_RCVTIMEO, &large_timeout);// 设置recv的超时时间(和SO_SNDTIMEO一样大,只是为了不死锁,如果有的话)。

    2. recv();// 现在我们等待来自客户端的响应。

这是做我想做的事情的合法方式吗?还是有更好的选择(最好是阻塞套接字和线程)?

PS只有在没有数据可用的情况下才会recv()返回超时?WSAETIMEDOUT如果有数据,它是否可以返回此错误,但recv()速度不足以处理所有数据,从而返回部分数据?

0 投票
4 回答
261 浏览

c++ - recv() 返回奇怪的缓冲区 C++

我知道 C++ 很长时间了,但是大约一年半前开始将它用于我的目的。我开始在 C++ 上学习网络编程,第一个网络项目是“通过 TCP/IP 在主机之间传输文件”,这听起来很简单,但我一直在发送数据。

我正在尝试发送小于 4KB 的小缓冲区,所以 buffer[4096] 对我来说很好,但我打算扩展它。WSAStartup()、socket()、bind()、listen()、accept() 函数工作正常,它们的值已为服务器和客户端初始化,但我正在处理其他问题,可能是 recv()、send()等我仍然找不到问题的根源。

此外,如果有人给我一个通过 TCP/IP 传输文件的示例,但不是在一个数据包中,我希望文件被分块并分部分发送,或者称为“环模型”,但我不能找不到工作模型;

PS这是我第一次在这里问,请反馈一下所有这些写得如何,这样我就可以写出更多信息以寻求社区帮助,谢谢)

服务器

客户

客户端的“a.txt”文件是 45 字节,这里是 45 * 'a'

这就是我在服务器端得到的,文件大小为 14 字节

0 投票
1 回答
5425 浏览

c++ - 通过 TCP 套接字发送文件 C++ | 视窗

我想在 Windows 上通过 C++ 中的 TCP 套接字发送文件,一切正常,但是我不能发送这样的大文件,我知道 TCP 作为任何协议都有它的局限性,比如我不能发送超过 64KB每个数据包,我的方法适用于小文件大小(测试全部高达 12KB),但我想发送 LARGE 文件,如 ubuntu 或 windows 的 iso 图像,它们肯定大于 12 个完全打包的数据包等。

服务器

客户

双方的所有值都已初始化,并且错误处理做得很好,如果我有问题,我会说的。我决定使用 MSG_WAITALL 因为我想这适合这种情况,请更正我的代码以接收/发送,如果可能的话重构它,如果有解释会更好,这样每个人都可以学习更好地编码,谢谢)))

0 投票
0 回答
36 浏览

c - 当一个程序同时包含套接字服务器和客户端时,我们应该注意什么?

我在Linux上使用C。

我编写了一个套接字服务器程序,用于处理客户端的 HTTP 请求。当程序接收到一个特定的请求时,它会连接到另一个 HTTP 服务器,发送一个 HTTP 请求,接收响应,然后发送一个响应给客户端。

代码是这样的:

但它包含许多问题。例如,它应该运行send(sock,......)3 次,这样recv(sock,......)就不会永久阻塞并接收正确的数据。

当我像这样分离代码时:

它们都可以正常运行。

我想知道如何编写具有套接字服务器和客户端的预期程序。

0 投票
0 回答
19 浏览

c++ - 在多线程 C++ 应用程序中控制控制台 I/O

我开发了一个多线程客户端-服务器控制台应用程序,其中不同的客户端连接到单个服务器并尝试与之通信。为此,我正在我的服务器应用程序中创建单独的线程(每个客户端一个)。

我面临的问题是;有一次,我只想在我的服务器应用程序中为 I/O 选择单个客户端,例如,如果我指示我的服务器应用程序选择 client-X,服务器应该停止与其他客户端的所有 I/O 并保留控制台仅适用于客户端 X(换句话说,特定于客户端 X 的线程应该控制标准 I/O

同样,如果我选择在某个时间后选择客户端-Y,它应该将 STDIO 的控制权转移给客户端-Y,反之亦然。

如何在我的服务器应用程序中实现此行为?

0 投票
0 回答
124 浏览

c - 接收缓冲区数据时套接字错误 10054 - winsock2.h 库

我是 websocket 编程的新手。我有一个客户端和一个服务器分别运行,它们都是在 Windows 7 上从 C 编译的。服务器运行良好,绑定、连接和消息传递成功。然而,让我感兴趣的是它没有出现在 netstat 命令中,监听确定的端口(9002)。客户端初始化时,会收到错误 10054,即“Connection reset by peer”。我已经在 Window 的防火墙上启用了这两个应用程序,重新启动了机器,但我无法弄清楚发生了什么。

客户端代码:

服务器端代码:

客户端程序输出以下内容:

服务器端程序输出以下内容:

请,任何提示和想法将不胜感激。谢谢。

0 投票
0 回答
68 浏览

c - Telegram api在c中返回400错误请求

我想将一些数据从传感器节点发送到电报机器人并执行从机器人接收到的命令到节点。我正在编写一个简单的 c 程序来执行 getMe api 命令并检查响应。套接字连接成功并将数据正确写入服务器,但总是电报服务器回复我:

我在用:

主机名:api.telegram.org 端口:443

这是我的c代码