我使用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()在第三次执行时崩溃,并显示以下消息:
“0x7ffff7bcc282”发送()无可用来源
查看反汇编... [按钮]
当我在虚拟机上运行服务器应用程序时,一切都运行正常。
有什么想法?提前谢谢!
答案 0 :(得分:1)
您的代码存在两个问题:
每次致电readfds
时,您都没有重置writefds
和select()
,因为每次都会修改它们。
您滥用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);
}