- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望我能解释一下。我是 C 编程新手,尝试使用 TCPIP 发送和接收二进制文件。当客户端发送时,服务器应该一次接收多个文件。我创建了一个bat文件用于发送到服务器。如果文件是 2 或 3 个,则没有问题,但在尝试发送大约 5 个文件时有时会显示错误。实际上文件没有正确接收。我用过
multithreading Synchronization of
Semaphore
method
打印时接收端(服务器)结果如下:
file name (5000.dat)
Invalid argumen(5000.dat)
completetfile name (5120.dat)
(5120.dat) complete
file name (8192.dat)
(8192.dat) complete
file name (10240.dat)
(10240.dat) complete
上面有些文字错误,每次显示的结果都不一样。有时可以正常接收和写入文件,有时有些文件无法读取。
我的接收方代码如下:
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <process.h>
#include <windows.h>
void fileReceive(void *param);
HANDLE semaphore;
HANDLE threadHandle;
int main(int argc, char *argv[]){
if (argc > 1) {
goto l_param_error;
}
WSADATA wsaData; // Contains information about the Windows Sockets implementation
SOCKET sock0; // creates a socket that is bound to a specific transport service provider.
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
SOCKET sock; // creates a socket that is bound to a specific transport service provider
// Initiates use of the Winsock DLL by a process.
int error = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (error != 0) {
goto l_WSAIni_error;
}
addr.sin_family = AF_INET;// internetwork: UDP, TCP, etc.
addr.sin_port = htons(8080);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
sock0 = socket(AF_INET, SOCK_STREAM, 0);
if (sock0 == INVALID_SOCKET) {
goto l_socket_error;
}
// associates a local address with a socket
if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
goto l_bind_error;
}
while (1) {
// places a socket in a state in which it is listening for an incoming connection
if (listen(sock0, 1) != 0) {
goto l_socket_conn_setup_error;
}
len = sizeof(client);
// The accept function permits an incoming connection attempt on a socket.
sock = accept(sock0, (struct sockaddr *)&client, &len);
if (sock == INVALID_SOCKET) {
goto l_error_accpet;
}
semaphore = CreateSemaphore(0, 1, 1, 0);
threadHandle = (HANDLE)_beginthread(&fileReceive, 0, &sock);
if (threadHandle == 0) {
printf("Thread handle error");
return 1;
}
CloseHandle(semaphore);
}
WSACleanup();
return 0;
}
void fileReceive(void *param) {
int n = 0;
int sock = *((int *)param);
unsigned char buf[1];
unsigned char buff[256] = { 0 };
FILE *fp = NULL;
memset(buff, 0, sizeof(buff));
WaitForSingleObject(semaphore, INFINITE);
// Receive file name
int recvFile = recv(sock, buff, 255, 0);
ReleaseSemaphore(semaphore, 1, 0);
if ((recvFile == 0) || (recvFile == -1)) {
goto l_recv_error;
}
fp = fopen(buff, "wb+");
if (fp != NULL) {
printf("file name (%s)\n", buff);
while (n = recv(sock, &buf[0], 1, 0) > 0) {
size_t written = fwrite(&buf, sizeof(buf), 1, fp);
if (written != 1) {
goto l_write_error;
}
}
printf("(%s) complete\n", buff);
}
else {
goto l_fp_error;
}
fclose(fp);
closesocket(sock);
_endthread();
CloseHandle(threadHandle);
}
最佳答案
不幸的是,您有一长串问题。说白了,好像你不懂TCP(它是字节流协议(protocol)),也好像你不明白线程同步解决什么问题,怎么使用。鉴于此,您正在尝试一项远远超出您能力的任务,应该首先尝试更简单的任务。从不使用线程的 TCP 代码或不使用 TCP 的线程代码开始,这样您就不必立即把所有事情都做好。
以下是一些问题:
您将 &sock
传递给线程。但随后可能会在线程读取之前更改 sock
的值。
您在 TCP 连接上调用 recv
来获取文件名,并假设您将读取所有且仅读取文件名。 TCP 无法将字节“粘合”在一起形成消息。如果您想要发送和接收消息,您必须定义一个消息协议(protocol)并在 TCP 之上实现它。
你的信号量实际上并没有做任何事情。您不使用它来通信或同步任何内容。
每读取 1 个字节,就写入 256 个字节。
关于C Windows 多线程 TCPIP 之间的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56748160/
我正在寻找一个 API,它使我能够构建一个应用程序,其中包含一个用于三星智能电视的自定义 Remote 。 Samsung 中记录了一些 API。 ,但它们似乎都没有提供标准 Remote 所具有的功
我无法将我的 db2 应用程序连接到我的 localhost 数据库。 应用程序使用的 db2 API 需要 TCPIP 并尝试连接到主机“localhost”和端口“50001”。 我的错误是。
这个问题在这里已经有了答案: C: socket connection timeout (8 个回答) 5年前关闭。 它并没有真正复制。使用非阻塞套接字时,您必须使用 select 方法检查是否创建了
在每个 tcp 数据包中打包尽可能多的数据显然会降低开销的相对权重。增加缓冲区大小可提高对 CPU 使用率峰值的稳健性。 但是还可以做些什么来实现最高数据速率? 增加数据读取器线程的优先级是个好主意吗
我刚刚开始学习 TCP/IP。 我编写了一个简单的 TCP/IP 服务器,它监听端口 3000 并在收到连接时生成一个线程。那个新线程坐下来读取数据。我的客户端应用程序创建了 100 个到该服务器的连
我需要一个 java 7 TCP/IP 客户端,它将阻塞直到它接收到用户指定的字符序列(在我的例子中是消息终止符/分隔符——这会自动将数据“分 block ”为单独的消息以供进一步处理)。我预计这将是
客户有一个系统,可以读取多个视频图像的大文件(最大 1 GB)。访问是通过“指向”较大文件的索引文件进行的。这在 LAN 上运行良好。如果这些文件保存在远程服务器上,有人对我如何通过 Internet
为什么在 TCP 3 次握手的第 3 部分没有传输数据?例如 (A 到 B)同步 (B 到 A)ACK+SYN (A 到 B)ACK.... 为什么不能将数据与此 ACK 一起传输? 最佳答案 我一直
我编写了一个 TCPIP 服务器,它实现了一个 FileSystemWatcher 并用从 FSW 获取的新文件解析的数据填充队列。 单个客户端将连接到此服务器并从队列中请求数据(任何时候都不需要其他
我想通过网络使用 adb 连接到 Android 设备。我熟悉How can I connect to Android with ADB over TCP?和https://developer.and
希望我能解释一下。我是 C 编程新手,尝试使用 TCPIP 发送和接收二进制文件。当客户端发送时,服务器应该一次接收多个文件。我创建了一个bat文件用于发送到服务器。如果文件是 2 或 3 个,则没有
是否可以在 Linux(嵌入式 Linux)上启动多个已经可用的 tcpip 堆栈实例?如果有人有这方面的任何信息? 最佳答案 我认为您无法在 Linux 中运行两个完整且独立的 TCP/IP 堆栈。
是否有来自 Matlab 仪器控制工具箱的 tcpip() 命令的实现?我已经搜索过了,但直到现在都没有找到。 Matlab 上 tcpip() 命令的文档位于此处:http://www.mathwo
我正在尝试使用 .NET 编写一个 tcpip 服务器。查看此站点上的线程,普遍的共识似乎是使用 .NET 3.5 SocketArgs 类的一些变体来最大程度地扩展但是我也必须使用 SSL,唯一的方
我需要远程 ADB shell..我知道我们必须发出“ADB tcpip”.. 将 ADB 服务器更改为 TCP 监听模式。 但是,问题是我的手机没有 root,而且我没有 USB 数据线。我无法发出
我已经阅读了很多关于 adb 和 tcpip 模式的帖子,我可以创建无线 adb 连接,但只有在 USB 调试打开时才可以。 我的使用方式是这样的: 已启用 USB 调试 在电脑上调用adb tcpi
我是 Android 开发的新手,目前我面临一些有关使用 TCPIP 远程连接我的 Android 设备的问题,我们将不胜感激。提前致谢。 最佳答案 然后使用 adb firest 连接您的手机 ad
我正在尝试使用 PIC24F 构建服务器。 这是我正在发布的一段代码: switch(TCPServerState) { case SM_HOME:
大家好,感谢大家的宝贵时间。 我的问题如下:当使用这个微芯片 TCPIP 堆栈时,它是否应该安装在任何类型的调度程序/RTOS 上,或者这个堆栈是否已经包含它工作所需的处理。 最佳答案 Microch
我对 TCPIP 的连接函数有问题,因为 QT 有类似的连接函数。 no matching function for call to MainWindow::connect(SOCKET&, sock
我是一名优秀的程序员,十分优秀!