Tag: tcp

为什么从TCP套接字读取整数数组时会得到奇怪的结果?

正如我在上一个问题( 如何在C中通过TCP发送整数数组? )的回答中所建议的那样,我尝试发送一个long int数组,但是我可能正在做一些事情来破解解决方案…… #define ARRAY_LEN 4 /* I’m using long because the numbers are very large, * but in this example they’re small to save space. */ long originalArray[ARRAY_LEN] = { 1, 2, 3, 4 }; myObject.SetMyArray(originalArray); // NOTE: The following is in a different function. long *myArrayFromFunction = myObject.GetMyArray(); write(clientSocketFD, myArrayFromFunction, sizeof(myArrayFromFunction) * […]

recv()套接字函数返回长度为0的数据

我有一个应用程序,它在端口号5005上与另一个设备(带有Web服务器的硬件设备)建立了套接字连接。 现在,如果我的硬件设备断开连接,那么我将断开与设备的连接。 这是否意味着我现在使用的套接字变为无效。 当发生此断开连接时,是否会收到任何特殊消息,如空字符或其他内容。 如果我的套接字连接变得无效,那么为什么recv()套接字函数不会抛出和SOCKET_ERROR。 相反,为什么我会收到0长度的数据。 谢谢

如何在C ++中创建RAW TCP / IP数据包?

我是C ++程序员/网络管理员的开始,但我想如果有人指出我正确的方向,我可以学习如何做到这一点。 大多数教程都使用旧代码进行演示,这些代码由于某种原因不再有效。 因为我在Linux上,所以我需要的是如何编写原始Berkeley套接字的解释。 有人可以给我一个快速的运行吗?

如何在C中通过TCP发送整数数组?

我认为write()只能发送byte的数据缓冲区(即signed char),那么如何使用sys / socket.h库中的C write()函数发送长整数数组呢? 显然,我不能只是强制转换或转换为char,因为任何超过127的数字都会格式不正确。 我看了一下这个问题, 如何将整数数组分解为一个字节数组(像素编码) ,但是无法理解它 – 如果这是我正在寻找的东西,请有人愚蠢一点吗? 跟进问题: 为什么从TCP套接字读取整数数组时会得到奇怪的结果?

C socket:确实发送等待recv结束?

我在Windows上使用阻塞C套接字。 我使用它们将数据的更新从服务器发送到客户端,反之亦然。 我以高频率(每100毫秒)发送更新。 send()函数是否会等待收件人recv()在结束之前接收数据? 如果我理解man手册页,我会假设: “send()的成功完成并不能保证传递信息。” 那么,如果一个运行10个send()而另一个只有完整的1个recv()什么? 我是否需要使用某种确认系统?

在C中通过TCP发送和接收整数值

在程序中,我需要通过TCP套接字发送一个整数值。 我为此目的使用了send()和recv()函数,但它们只是以字符串forms发送和接收它。 是否有send()和recv()替代方法,以便发送和接收整数值?

有没有办法检测远程对等端已关闭TCP套接字,而不读取它?

首先,一些背景来解释动机:我正在研究一个非常简单的基于select()的TCP“镜像代理”,它允许两个防火墙的客户端间接地相互通信。 两个客户端都连接到此服务器,并且只要两个客户端都连接,客户端A发送到服务器的任何TCP字节都将转发到客户端B,反之亦然。 这或多或少有效,只有一个小问题:如果客户端A连接到服务器并在客户端B连接之前开始发送数据,则服务器没有任何地方可以放置数据。 我不想在RAM中缓冲它,因为这可能最终使用大量的RAM; 我也不想丢弃数据,因为客户端B可能需要它。 所以我选择了第三个选项,即在客户端B连接之前,不要在客户端A的套接字上选择() – for-read-ready。 这样客户端A就会阻塞,直到一切都准备就绪。 这或多或少也有效,但是在客户端A的套接字上没有选择准备就绪的副作用是,如果客户端A决定关闭他与服务器的TCP连接,则服务器不会收到有关该事实的通知 – – 至少,直到客户端B出现并且服务器最终在客户端A的套接字上选择for-ready-ready,读取任何未决数据,然后获得套接字关闭通知(即recv()返回0)。 如果服务器有一些方法知道(及时)客户端A关闭他的TCP连接,我更喜欢它。 有没有办法知道这个? 在这种情况下轮询是可以接受的(例如,我可以让select()每分钟唤醒一次并在所有套接字上调用IsSocketStillConnected(sock),如果存在这样的函数)。

C中的multithreading服务器/客户端实现

我刚开始学习基本的网络概念。我正在尝试在C中实现multithreading服务器 – 客户端程序。但问题是不是为客户端运行多个windows / terminal / instance,我应该使用fork()来创建客户端的子项.so通过创建客户端的子节点,将创建多个客户端。现在,每个子客户端都将在线程上与服务器通信。 之前我创建了类似的编程,但是对于多个客户端,您必须为客户端打开多个窗口并运行所有这些窗口。 我无法修改我的代码(在服务器和客户端的代码。我认为服务器一个是好的。但我不知道在客户端程序中fork()的位置以及应该进行哪些更改)。 实际上我不想打开多个窗口来运行多个客户端,这就是为什么我使用fork()创建它的多个副本。是否有任何其他方式我可以创建多个客户端并将它们连接到我的服务器prog线程。 服务器: // socket server example, handles multiple clients using threads #include #include //strlen #include //strlen #include #include //inet_addr #include //write #include //for threading , link with lpthread //the thread function void *connection_handler(void *); int main(int argc , char *argv[]) { int socket_desc , client_sock , […]

使用Winsock将客户端TCP套接字绑定到特定本地端口时,SO_REUSEADDR没有任何影响

我将客户端 TCP套接字绑定到特定的本地端口。 为了处理套接字保持TIME_WAIT状态一段时间的情况,我在套接字上使用带有SO_REUSEADDR setsockopt() 。 它适用于Linux,但不适用于Windows,当前一个连接仍在TIME_WAIT时,我在connect()调用时得到WSAEADDRINUSE 。 MSDN并不完全清楚客户端套接字会发生什么: […]对于需要将多个套接字绑定到同一端口号的服务器应用程序,请考虑使用setsockopt ( SO_REUSEADDR )。 客户端应用程序通常不需要在所有连接上调用bind-connect自动选择未使用的端口。 […] 我该如何避免这种情况?

如何发送和接收数据套接字TCP(C / C ++)

可能重复: 在C / C ++中从TCP套接字读取的正确方法是什么? 我正在尝试开发TCP客户端/服务器。 我的问题是,当我尝试从客户端发送数据时,我会在一次发送中执行此操作。 但是当我尝试接收具有特定结构的数据时出现我的问题,我的意思是,前8个字节设置日期,接下来的10个名称和未定义的字节数设置文本(此文本以/ r / n结尾) / R / N) 客户端发送如下: char date[8]; char name[10]; char msg[4096]; strcpy(msg,”12/10/12″); //8 bytes strcat(msg,”Kevin Fire”); //10 bytes strcat(msg,”abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde\r\n\r\n”); nbytes_sent = send(sock,(char *)msg,sizeof(msg),0); printf(“Bytes_sent: %s -> %i\n”,msg,nbytes_sent); 并且服务器尝试从socket解析数据,如下所示: char date[8]; char name[10]; char * text; char buf[1024]; int i=0; for(i=0; i < 8; i++) […]