我想创建一个客户端并将其连接到服务器。我知道客户端进程在服务器之前开始运行,所以我在无限循环中进行连接,直到它接受为止。然后我想输入消息给客户端并发送给服务器,服务器会在屏幕上打印它们。我删除了代码中的所有错误检测,使其更短,我知道他们必须在那里。我试图这样做,但服务器收不到任何东西,客户端不能做第二次连接。C posix套接字,无法将数据从客户端发送到服务器
服务器
int main(int argc, char *argv[])
{
int sockfd, newsockfd;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(5000);
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(sockfd, 5);
clilen = sizeof(cli_addr);
while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen) >= 0)
{
read(newsockfd, buffer, 255);
close(newsockfd);
}
close(sockfd);
return 0;
}
客户
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in serv_addr;
char buffer[256];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(5000);
while (1) {
while ((connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)) {
printf("trying to connect\n");
sleep(1);
}
printf("connected\nplease, enter a message\n");
scanf("%s", buffer);
write(sockfd, buffer, strlen(buffer));
}
close(sockfd);
return 0;
}
一旦'connect()'失败,就不能保证它可以在同一套接字上再次被调用。通常最好在每个connect()尝试中销毁并重新创建套接字。然而,无论哪种方式,一旦'connect()'成功,在下一次循环迭代中再次调用'connect()'之前,客户端不会关闭连接的套接字。 –
如果您从代码中删除所有错误处理,您怎么可能期望能够调试它?这不是一个合理的策略。在你提供一个错误代码之前,它也不是一个可以回答的问题,直到你把错误处理回来,你才能这样做。直到同上之前,您无法证明没有错误代码。 – EJP