クライアントを作成してサーバーに接続します。私はクライアントプロセスがサーバーの前に実行されることを知っているので、受け入れられるまで無限ループで接続を行います。次に、クライアントにメッセージを入力してサーバーに送信して、画面に表示します。コードからすべてのエラー検出を削除して短くしましたが、そこにいなければなりません。私はこのようにしようとしていますが、サーバーは何も受信せず、クライアントは2番目の接続を行うことができません。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