1. ホーム
  2. c

[解決済み] ソケットプログラミングのconnect()が2回目にループを実行したときに失敗する

2022-02-04 21:54:36

質問内容

サーバー側とクライアント側をforループで動作させようとしています。最初に実行したときはうまくいくのですが、2回目に実行したときは接続に失敗するか、accept()のところで止まってしまいます。以下は私のコードです。

クライアントのコード

for(i=0;i<2;i++)
{
        if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\nError : Connect Failed\n");
        return 1;
    }   

    //***************Writing_I***************
    memset(recvBuff, '0',sizeof(recvBuff));
    ticks = time(NULL);
    snprintf(recvBuff, sizeof(recvBuff), "%.24s\r\n", ctime(&ticks));
    if((n = send(sockfd, recvBuff, strlen(recvBuff), 0))<0)
    {
        printf("Error : send operation failed\n");
    }

    //***************Reading_I***************
    memset(recvBuff, '0', sizeof(recvBuff)); 
    n= recv(sockfd, recvBuff, sizeof(recvBuff)-1, 0);
    {
        printf("bytes read: %d\n", n);
        recvBuff[n] = '\0';
        printf("Data: %s\n",recvBuff);
    } 
    if(n < 0)
    {
        printf("\n Read error \n");
    } 
}
close(sockfd);  

サーバーのコードです。

if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL))>=0)
{ 
    for(i=0;i<2;i++)    
    {   
        fd= open("/home/t/Desktop/CS II/A4/test.txt", O_RDONLY);
        //***************Reading***************
        memset(sendBuff, '0', sizeof(sendBuff)); 
        count = recv(connfd, sendBuff, sizeof(sendBuff)-1, 0);
        {
            printf("bytes read: %d\n", count);
            sendBuff[count] = '\0';
            printf("Data: %s\n",sendBuff);
        }
        if(count < 0)
        {
            printf("Read error \n");
        }

        //***************Writing***************
        ticks = time(NULL);
        memset(sendBuff, '0', sizeof(sendBuff)); 
        printf("Reading from file\n");
        if((noOfBytesRd= read(fd, sendBuff, sizeof(sendBuff)-1))<0)
            printf("\n Error : read operation failed\n");
        sendBuff[noOfBytesRd]='\0';
        if((count = send(connfd, sendBuff, strlen(sendBuff), 0))<0)
            printf("\n Error : wtite operation failed\n");
    }
    close(connfd);  
 }

解決方法は?

ソケットは connect のライフサイクルの中で一度だけ作られます。接続するたびに別のソケットを作成し、接続が終了したら閉じる必要があります。