我正在使用C语言和Linux平台开发两个小应用程序。第一个是客户端,通过套接字发送字符;第二个是服务器,读取消息并发送回读取到的同样内容。
一旦应用程序之间建立了连接,下面的代码将发送和接收相同的消息5次:
代码已编辑:
该程序成功发送和接收消息两次。当尝试第三次发送时失败,即使函数select返回一个大于0的值(这意味着服务器已准备好接收数据)。
在使用eclipse进行调试时,函数send()在第三次执行时崩溃,并显示以下消息: 无法获取“send() at 0x7ffff7bcc282”的源代码 查看反汇编... [按钮]
然而,在虚拟机上运行服务器应用程序一切正常。
有什么想法吗?提前感谢!
一旦应用程序之间建立了连接,下面的代码将发送和接收相同的消息5次:
代码已编辑:
char buf[100];
char message[100];
fd_set readfds, writefds;
int n, rvd;
memset(message, 0, sizeof(message));
message[0] = 'a';
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s);
printf("client: connecting to,, %s\n", s);
freeaddrinfo(servinfo);
n = sockfd+1;
for (unsigned long i=0; i<5; i++)
{
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(sockfd, &readfds);
FD_SET(sockfd, &writefds);
rvd = select(n, NULL, &writefds, NULL, NULL);
if (rvd > 0)
{
printf("client: writing '%s'\n",message);
if ((numSent = send(sockfd, message, strlen(message), 0)) != -1)
{
rvd = select(n, &readfds, NULL, NULL, NULL);
if (rvd > 0)
{
if ((numbytes = recv(sockfd, buf, numSent, 0)) != -1)
{
printf("client: received '%s'\n",buf);
}
//timestamp it
//count successful package sent
}
else
{
//throw this measurement
}
}
}
}
该程序成功发送和接收消息两次。当尝试第三次发送时失败,即使函数select返回一个大于0的值(这意味着服务器已准备好接收数据)。
在使用eclipse进行调试时,函数send()在第三次执行时崩溃,并显示以下消息: 无法获取“send() at 0x7ffff7bcc282”的源代码 查看反汇编... [按钮]
然而,在虚拟机上运行服务器应用程序一切正常。
有什么想法吗?提前感谢!
message
和buf
的定义,以及如何填充message
。 - chux - Reinstate Monicawritefds
和readfds
是否只包含sockfd
,如果是这样,你可以直接使用阻塞套接字进行send
和recv
,因为你无论如何都使用了select
而没有设置超时。此外,你没有展示是否正确设置了n
。你用%s
打印message
,但声称它是一个char
,所以应该使用%c
。由于你似乎对printf
没有问题,我假设message
是一个char*
或const char*
,这会导致在写入buf
时出现问题,而使用sizeof(message)
而不是你的buf
变量的大小。 - foobarsizeof(message)
不等于size_t len
的值。最好使用send(sockfd, message, strlen(message), 0)
来发送message
中字符的数量,而不是使用sizeof(char *)
。 - David C. Rankinsizeof(char*) != strlen(char*)
. 你需要停止使用sizeof()
,因为你没有正确使用它。 - Remy Lebeau