質問をする前に、私はネットワーク プログラミングの分野では初心者であることをお知らせします。間違いをお許しいただき、改善方法を提案してください。前もって感謝します!
私のネットワーク プログラミング クラスの課題で、教授は fork() を使用するクライアント プログラムを作成するように求めています。
pid = fork();
if (pid == 0) // child
Send();
else //parent
Recv();
そして、私が試みているコードは次のとおりです。
#include <cstdlib>
#include <stdio.h>
#include <error.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define SERVER_PORT_NUM "10060"
#define MAX_BYTES 2000
using namespace std;
int main(int argc, char** argv) {
int status;
struct addrinfo hints;
struct addrinfo *servinfo;
char buf[MAX_BYTES];
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ( (status = getaddrinfo("localhost", SERVER_PORT_NUM, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return 2;
}
int s;
if ((s = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) {
fprintf(stderr, "socket: %s\n", gai_strerror(s));
return 2;
}
if (connect(s, servinfo->ai_addr, servinfo->ai_addrlen) == -1) {
close(s);
}
freeaddrinfo(servinfo);
char ch='\0';
pid_t pid = fork();
if (pid == 0) {// child process
while(1){
memset(&buf, 0, sizeof(buf));
scanf("%s",buf);
send(s,buf,strlen(buf),0);
}
}//pid==0
else { //parent process
int numbytes=0;
memset(&buf, 0, sizeof(buf));
while(1) {
if((numbytes= recv(s, &buf, MAX_BYTES-1, 0)) >0) {
printf("\n%s", buf);
memset(&buf, 0, numbytes);
}
if(numbytes < 0) {
printf("Error receiving data");
}
}
}
close(s);
return 0;
}
クライアント端末でユーザーからの入力がある場合にのみサーバーにデータを送信し、サーバーからのデータがある場合はクライアント端末に表示したい。現在、サーバーから一度データを取得した後、ハングしています。サーバーとの間でデータの送受信を終了するための最良の条件は何ですか?