0

UDP を使用してチャット プログラムを作成しようとしています。メッセージを個別に送受信するために、クライアントとサーバーの両方に親プロセスと子プロセスを作成しました。問題は、サーバーが送信できないことです。助けてください。これが私のコードです。

クライアント

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/stat.h>
    #include <arpa/inet.h>

    int main(int argc, char **argv)
    {
        int sockfd;
        struct sockaddr_in servaddr;
        socklen_t len = sizeof(servaddr);
        char mesg[1024], rmesg[1024];
        pid_t pid;

        if(argc!=2){ 
            printf("Usage: %s <ip_addr>\n",argv[0]);
            exit(1);
        }

        sockfd = socket(PF_INET,SOCK_DGRAM,0);
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(54321);
        inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

        pid = fork();
        if(pid == 0) {
            printf("Type 'exit' to Exit. \n");
            while(1){
                fgets(mesg,sizeof(mesg),stdin);
                sendto(sockfd,mesg,strlen(mesg),0,(const struct sockaddr *)&servaddr,len);
                if(strcmp(mesg, "exit\n") == 0)
                    break;
            }
            close(sockfd);
            kill(pid, SIGINT);
            exit(0);
        }else{
            while(1){
                memset(rmesg,0,sizeof(rmesg));
                if(recv(sockfd,rmesg,sizeof(rmesg),0) > 0 ){
                    printf("From Server: %s", rmesg);
                }
            }
        }
        close(sockfd);
        return 0;
    }

サーバ

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/stat.h>
    #include <arpa/inet.h>

    int main(int argc, char **argv)
    {
        int sockfd1;
        struct sockaddr_in servaddr,cliaddr;
        socklen_t len = sizeof(cliaddr);
        char cli_ip[32];
        char mesg[1024], smesg[1024];
            pid_t  pid1;

        sockfd1 = socket(PF_INET,SOCK_DGRAM,0);
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(54321);
        inet_ntop(AF_INET,(struct in_addr *) &cliaddr.sin_addr, cli_ip, sizeof(cli_ip) );

        if ( bind( sockfd1, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0 ){
            perror(NULL);
            exit(-1);
        }

        pid1 = fork();
        if(pid1 == 0){
            while(1){
                memset(mesg,0,sizeof(mesg));
                if( recvfrom(sockfd1,mesg,sizeof(mesg),0,(struct sockaddr *)&cliaddr,&len) > 0 ){
                    printf("From client: %s",mesg);
                }
            }
        }else{
            printf("Type 'exit' to Exit. \n");
            while(1){
                fgets(smesg,sizeof(smesg),stdin);
                sendto(sockfd1,smesg,strlen(smesg),0,(struct sockaddr *)&cliaddr,len);
                if(strcmp(smesg, "exit\n") == 0)
                    break;
            }
            close(sockfd1);
            kill(pid1, SIGINT);
            exit(0);
        }
        return 0;
    }
4

2 に答える 2

1

問題はクライアントにある可能性が最も高いです。

while(1){
    if(recv(sockfd,rmesg,sizeof(rmesg),0) > 0 ){
        printf("From Server: %s", rmesg);
    }
}

recv接続されていない socketを呼び出しています。ENOTCONN無視しているエラー(おそらく)が発生する可能性があります。また、クライアントの CPU 使用率が高いこともわかっていると思います。これは、継続的にループし、各システム コールが失敗しているためです。

recvfrom解決策は、代わりに使用することです。connect別の方法として、たとえそれが であっても、ソケットを呼び出すことができますSOCK_DGRAMが、これは通常行われません。

于 2013-09-07T15:22:54.270 に答える
0

サーバーとクライアントの両方に同じソケットを使用しているのはなぜですか? これは意味がありません。より簡単な代替手段は、2 つのスレッドを使用することです。1 つのスレッドがサーバー ソケットを処理し、もう 1 つのスレッドがクライアント スレッドを処理します。もちろん、ソケットも 2 つ必要です。1 つはサーバー用、もう 1 つはクライアント用です。また、 sendto() には、受信者のアドレスとポート情報が必要です。

于 2013-09-07T15:28:21.733 に答える