0

ローカルソケットを使用して2つのプロセス間で通信するプログラムを作成しました

クライアントがサーバーに 1 つのメッセージを送信してから接続を閉じた場合、サーバーは 1 つのメッセージしか受信しません。

クライアント:

   send(srvfd,data,size,0)
   close(srvfd)

サーバ:

   n=recv(fd,buf,size,0)

ただし、クライアントが 1 つのメッセージを送信し、サーバーも 1 つのメッセージ (任意の文字列) をクライアントに送信した場合、クライアントは接続を閉じ、サーバーはクライアントが送信した古いメッセージを受信します。

クライアント:

   send(srvfd,data,size,0)
   n=recv(srvfd,buf,size,0)
   close(srvfd)

サーバ:

   n=recv(fd,buf,size,0)
   send(fd,"response",8,0)
   n=recv(fd,buf,size,0)   //receive the first message again

ここに私の初期化コードがあります:

struct sockaddr_un srvAddr;
int listenFd = socket(PF_UNIX, SOCK_STREAM, 0);
if (listenFd < 0) {
    perror("cannot create communication socket");
    throw runtime_error("cannot create communication socket");
}
srvAddr.sun_family = AF_UNIX;
strncpy(srvAddr.sun_path, sockFile.c_str(), sockFile.size());
unlink(sockFile.c_str());

int ret = bind(listenFd, (struct sockaddr*) &srvAddr, sizeof(srvAddr));
if (ret == -1) {
    perror("cannot bind server socket");
    close(listenFd);
    unlink(sockFile.c_str());
    throw runtime_error("cannot bind server socket");
}

ret = listen(listenFd, BACKLOG);
if (ret < 0) {
    perror("cannot listen the client connect request");
    close(listenFd);
    unlink(sockFile.c_str());
    throw runtime_error("cannot listen the client connect request");
}
4

1 に答える 1

2
send(fd,"response",8,0)
n=recv(fd,buf,size,0)   //receive the first message again

いいえ、しませんでした。あなたが得たのはn == 0、ストリームの終わりを意味する でした。また、ゼロバイトがバッファに転送されたことも意味するため、現在バッファにあるものは意味をなさない。

戻りコードを無視しないでください。

于 2015-09-17T18:30:50.743 に答える