2016-04-11 16 views
2

では動作しません:aio_write私はシンプルなクライアント・サーバprogram.Myクライアントプログラムを書くためにAIOを使用することを始めています、私の単純なクライアント/サーバproggram

int main(int argc, char const *argv[]) 
{ 

    int port = 6000; 
    struct sockaddr_in my_address; 
    memset(&my_address, 0, sizeof(my_address)); 
    my_address.sin_family = AF_INET; 
    my_address.sin_addr.s_addr = htonl(0x7f000001); // 127.0.0.1 
    my_address.sin_port = htons(port); 

    int fd = socket(AF_INET, SOCK_STREAM, 0); 

    connect(fd, (struct sockaddr*)&my_address, sizeof(my_address)); 

    char * str = "hello"; 

    struct aiocb my_aio; 
    memset((void*)&my_aio, 0, sizeof(struct aiocb)); 
    my_aio.aio_fildes = fd; 
    my_aio.aio_buf = str; 
    my_aio.aio_nbytes = strlen(str); 
    aio_write(&my_aio); 
    return 0; 
} 

私のサーバープログラム:

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
    } 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR on binding"); 

    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
    sleep(5); 
    bzero(buffer,256); 
    n = read(newsockfd,buffer,255); 
    if (n < 0) error("ERROR reading from socket"); 
    printf("Here is the message: %s\n",buffer); 

    return 0; 
} 

私はサーバー側がこんにちはを印刷することを期待していますが、そうではありません。前もって感謝します。

答えて

1

あなたのコードは、それ以外の場合は動作しますが、非同期書き込みが完了する前に、あなたのmainが終了します。ソケットは非同期書き込みが完了する前に閉じられます。私はそれがあれば与えていた、そして今helloが正常にサーバーに送信されたエラーかを調べるためにaio_write呼び出しの後perror("aio_write")を追加すると、わずかでした。

mainを終了する前に未処理操作が完了していることを確認するには、おそらくaio_suspendを使用します。

関連する問題