gpt4 book ai didi

c - 在同一台机器上运行的 C 应用程序之间的套接字通信

转载 作者:行者123 更新时间:2023-12-02 03:33:16 24 4
gpt4 key购买 nike

我正在使用 C 语言和 Linux 作为平台开发两个小应用程序。第一个是客户端,通过套接字发送一个字符,第二个是服务器,读取消息并发回读取的相同内容。

一旦在应用程序之间建立了连接,那么下面的代码应该发送和接收相同的消息 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”没有可用的源代码

查看反汇编... [按钮]

当我在虚拟机上运行服务器应用程序时,一切运行正常。

有什么想法吗?提前致谢!

最佳答案

您的代码有两个问题:

  1. 您不会在每次调用 select() 时都重置 readfdswritefds,因为它每次都会修改它们。

  2. 您误用了 sizeof()

尝试更像这样的东西:

char message[1024];
char buf[1024];
fd_set readfds, writefds;
int numSent, numRead;

memset(message, 0, sizeof(message));
strncpy(message, "whatever you need to send...", sizeof(message)-1);

for (unsigned long i = 0; i < 5; ++i)
{
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);

FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);

rvd = select(sockfd+1, NULL, &writefds, NULL, NULL);
if (rvd == -1)
break;

printf("client: writing '%s'\n", message);
if ((numSent = send(sockfd, message, strlen(message), 0)) < 1)
break;

rvd = select(sockfd+1, &readfds, NULL, NULL, NULL);
if (rvd == -1)
break;

if ((numRead = recv(sockfd, buf, numSent, 0)) < 1)
break;

printf("client: received '%*s'\n", numRead, buf);
}

关于c - 在同一台机器上运行的 C 应用程序之间的套接字通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com