2

ソケットプログラミングを学んでいます...クライアントの画面に文章を入力すると、それがサーバーに送信され、サーバーが動作している端末に表示されるプログラムを作成しようとしていました....コードはここにあります.....(この質問に対する最初の回答を見た後、私は間違いに気づき、read()関数のsockfd1をconnfdに変更し、server.cppのaccept()の後にfork()を使用しました...しかし、それでもprog動作しません)

以前の client.cpp では、fgets(clibuff, 100, stdin) を使用し、これと write(sockcli, clibuff, strlen(clibuff)) を無限 for ループに入れていましたが、うまくいきませんでした...

だから私はそれを1つのステートメントだけで機能させることに決め、forループを削除しました....しかし、これも機能しません...

これらを2つの別々のコマンドラインで実行すると、両方とも正常に起動します(両方のプログラムのxが0を出力するため)...しかし、クライアント側で何かを入力してEnterキーを押すと...サーバーウィンドウに表示されません。 .. コードの関連部分は次のとおりです。

-------server.cpp-----

int sockfd1;
sockfd1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int x=bind(sockfd1, (sockaddr*)(&serv), sizeof(serv)); //serv is my sockaddr_in structure
cout<<x<<endl;
listen(sockfd1,5);

listen(sockfd1,5);
int y;
for(;;)
{
connfd=accept(sockfd1, &cliaddr, &siz);     

if((y=read(sockfd1, servbuff, 100))>0) //i changed sockfd1 here to connfd
fputs(servbuff, stdout);

}



-----client.cpp------

char clibuff[100];
char line[100];

sockaddr_in cli;
bzero(&cli, sizeof(cli));
cli.sin_family=AF_INET;
inet_aton("127.0.0.1", &(cli.sin_addr));
cli.sin_port=htons(2289);

int sockcli;
sockcli=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int x= connect(sockcli,(sockaddr*)&cli, sizeof(cli));
cout<<x<<endl;

cin>>clibuff;
write(sockcli, clibuff, strlen(clibuff));

return 0;

私は何を間違っていますか?

4

1 に答える 1

2

リスニング ソケットから読み取っています。あなたはそれをすべきではありません。

「connfd」は、新しく接続されたクライアントの server<>client ソケットです。これは、そのクライアントの読み取り/書き込みを行うソケットです。各クライアントを個別に処理できるように、「connfd」をパラメータとして新しいスレッドを作成するのが一般的です。

accept() を読んでください。

于 2012-04-21T17:58:48.503 に答える