- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我运行服务器之后,我运行了两个客户端实例。现在我第一次运行客户端时,接收到的数据被保存到数组 [0] 中,但是当我运行第二个客户端时,数组 [0] 的值令人惊讶地被新值覆盖。新数据应保存在数组 [1] 中而不是覆盖。我犯了什么错误?
字符*数组[100];int 数组计数 = 0;是全局变量。
void *server()
{
int listenfd = 0;
connfd = 0;
struct sockaddr_in serv_addr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(port));
if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))<0)
{
perror("bind");
exit(1);
}
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
printf("data in Array[0] before recv : %s\n",Array[0]);
int ns;
char revdData[2000];
bzero(revdData,2000);
ns = recv(connfd,revdData,2000,0);
close(connfd);
printf("data in Array[0] after recv : %s\n",Array[0]);
Array[ArrayCount] = revdData;
ArrayCount = ArrayCount+1;
}
}
客户端代码
void *client()
{
int soctype = SOCK_STREAM;
struct hostent *hp, *gethostbyname();
struct sockaddr_in servR;
struct servent *seR;
int tempSocket;
char *host = "localhost";
if ((tempSocket = socket(AF_INET, soctype, 0)) < 0)
{
perror("socket");
exit(1);
}
if ((hp = gethostbyname(host)) == NULL)
{
exit(1);
}
servR.sin_family = AF_INET;
memcpy(&servR.sin_addr, hp->h_addr, hp->h_length);
if (isdigit(*port))
{
servR.sin_port = htons(atoi(port));
}
else
{
if ((seR = getservbyname(port, (char *)NULL)) < (struct servent *) 0)
{
perror(port);
exit(1);
}
servR.sin_port = seR->s_port;
}
if (connect(tempSocket, (struct sockaddr *) &servR, sizeof(servR)) < 0)
{
perror("connect");
exit(1);
}
char input[100];
fgets(input,100,stdin);
int n;
n=send(tempSocket,input,100,0);
if (n < 0)
{
error("Send");
}
}
输出如下:
data in Array[0] before recv : (null)
data in Array[0] after recv : (null)
data in Array[0] before recv : 1st Instance
data in Array[0] after recv : 2nd Instance
recv 之后的理想数据应该是“第一个实例”,因为我正在打印数组 [0]。
最佳答案
服务器代码中的这个分配没有做你想做的:
Array[ArrayCount] = revdData;
这是无效代码,因为 revdData
是一个范围限定为 server()
的本地数组。赋值不复制数组,它复制指向其第一个元素的指针。因此,当您从 server()
返回时,Array
包含指向无效位置的指针 - 本地 revdData
数组的内存是无效的。接下来会发生什么是未知的。通常,由于您将再次调用 server()
,很可能相同的内存空间被重新用于新的 revdData
数组,因此它最终会被覆盖你不想要的。
要修复它,您必须在 Array[ArrayCount]
中分配内存然后使用 strncpy
,或者使用 strndup
。
以下是您可以使用 strncpy
执行的操作:
Array[ArrayCount] = malloc(ns);
strncpy(Array[ArrayCount], revdData, (size_t) ns);
此外,您可以将 ns
从 int
更改为 ssize_t
,这是 recv
的返回类型。
如果你想使用strndup
,你不需要显式地使用malloc
,但是,如果你的数据包含空字节,它不会复制超过那个点, 如果没有,它会在复制的字符串中添加一个空字节,这可能不是您想要的。
注意这种方式引入了内存管理的问题;在某些时候,您必须释放分配给 Array
中每个位置的内存。您有责任这样做,尽管在小程序中您通常可以依赖这样一个事实:所有分配的内存在程序终止时由操作系统释放。
关于c - recv() 后数组值意外更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929584/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
美好的一天, 我正在用 VC++ 开发一个应用程序,它使用 UDP 协议(protocol)与 Windows XP 上的 winsock 进行通信。以前我已经能够假设该工具接收到的所有数据包都来自一
所以我需要从服务器向客户端接收一个 html 文件,该文件比缓冲区大所以我发送了几次。这就是为什么我在接收时有这个循环 while (i = recv(s, buf, TAM_BUFFER, 0))
我有几个关于 C 中的套接字库的问题。这是我将在问题中引用的代码片段。 char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); 我如何决
当我的代码处于阻塞的 recv 调用中时,如果另一端重新启动,那么这一端的 recv 调用不会知道它,只会进入挂起状态。 如何避免这种情况? 最佳答案 默认情况下,如果连接的另一端在没有正确终止连接的
我有一个在平台上运行的 TCP 服务器,它从缓冲区读取字节并在一个发送调用中通过网络发送所有字节: send(sSocket.client_sock, base, frb_size, 0); frb_
假设以下代码(为了简单起见,我在这里省略了必要的错误处理): recv(sockfd, NULL, 0, MSG_PEEK); recv(sockfd, buff, bufflen, 0); 在那种情
我想用 ansible 安装 facebook osquery。 ubuntu的使用说明如下: sudo apt-key adv --keyserver keyserver.ubuntu.com --
我遇到了 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起。 问题描述:- 系统 A 的应用正在通过非阻塞套接字写入数据,而系统 B 的应用正
我正在构建一个 TCP 应用程序,它使用换行符 \n 来分隔未知长度(但通常小于 64 字节)的消息。我正在寻找 this article非常有用。 是一次recv一个字符并检查它是否为换行符或r
我使用 epoll 实现 TCP 套接字通信来监视所有客户端事件,只有一个线程在一个 for 循环中处理所有客户端。每个套接字都是非阻塞的。 现在我遇到了一个问题,当客户端发送的数据超过MTU时,意味
在python中,方法是: socket.recv(bufsize[, flags]) 在C中,方法是: int recv( _In_ SOCKET s, _Out_ char *buf, _In_
如果我有一个套接字 s 会发生什么,它上面当前没有可用数据,它是一个阻塞套接字,我从两个套接字上调用 recv线程一次?其中一个线程会获取数据吗?双方都会得到吗?第二次调用 recv 会返回错误吗?
我有一个非常烦人的问题,我在其他论坛上发现了几次,但是找不到合适的解决方案。 问题是recv()在连接的最后几个字节上返回0。以下是一些背景信息。 两种(客户端/服务器)应用程序都在同一台计算机上运行
我正在使用 C 语言在 Unix 上编写客户端/服务器程序,使用发送/接收。我偶尔会从 recv 调用中遇到段错误。该行为不能完全重现;有时它会发生,有时程序会运行到完成。 知道这意味着什么吗? 最佳
我想 mock 套接字的recv函数并遇到麻烦。即使我没有必要,也要获取实际上连接套接字所需的错误。 这是所有相关代码: Class A: def __init__.py(self):
我已经编写了一个服务器-客户端程序,我想问一问:32位和64位操作系统之间recv()函数的行为是否有所不同。 我之所以这样问是因为我在64位笔记本电脑上同时运行服务器和客户端,并且一切正常。我这样调
我有许多设备需要从中获取状态更新。我只需要一个套接字对象,而我只需要 socket.recv() 来获取状态。放入单线程应用程序,不会出现问题: class Device: def recei
在 C 中,我希望读取页面的 html,但我希望保存数据的缓冲区是动态的。我知道我必须通过循环和使用 realloc 来执行此操作但我不太确定我将如何去做。假设我的套接字( sock )已经打开,请考
这个循环应该逐行从套接字中获取数据并将其放入缓冲区。出于某种原因,当没有新数据返回时, recv 返回它得到的最后几行。我能够通过注释掉第一个 recv 来阻止这个错误,但是我不知道下一行会有多长时间
我是一名优秀的程序员,十分优秀!