ので、イムは、両側に構造を定義した:のmemcpy()修正クライアントソケットファイルディスクリプタクライアントとの間でserver.I構造を送信しようと
struct msg {
char name[50];
char time[50];
int len;
char buf[200];
}
問題がserver.c
で発生します。私はすでにこの行で問題を見つけた:
struct msg s1;
char buffer_input[1024]={0};// the buffer stream for sending
...// omitted all sorts of initializations cuz they all passed my debug and tests
memset(buffer_input,0,sizeof(buffer_input));
memcpy(buffer_input,&s1,sizeof(s1));
/* Originally, the send() call read: */
/* ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen); */
ssize_t size=send(client_sock,buffer_input,sizeof(buffer_input),0);
if(size<0) perror("send()");
は、標準出力に、私が持っている:
send() : Socket operations on non-socket object
をので、私はmemcpy(buffer_input,&s1,sizeof(s1))
が原因である可能性がありますことを予感しています。だから、コードを次のように変更しました。
memset(buffer_input,0,sizeof(buffer_input));
strcpy(buffer_input,"example");
send()は完全に機能し、正しい形式でメッセージを受け取りました。
一連のデバッグ後、memcpy(...)
の後に、クライアントソケットのファイル記述子が0
から8
に変わったことに気付きました。
ライン
ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen);
が
ssize_t size=send(client_sock, buffer_input, 1024);
それともbuffer_input
を取り除くと持っを読む必要がありますので、私は..
あなたは正確にあなたが誰かの答えは、コードに誤りがあることを示唆している時に、質問を編集する必要はありませんので、トラブルの原因となるコードをコピーしたことを確認してください。それは誰にとっても難しいことです。 –
's1'とは何ですか? 'sizeof(s1)'とは何ですか?それに直面して、 'sizeof(s1)> sizeof(buffer_input)'と 'memcpy()'は境界を越えて踏みにじっていて、それが踏んだビットの1つがあなたのファイルディスクリプタです。 'assert(sizeof(s1)<= sizeof(buffer_input));' assertをいくつか追加してください。それが発生すると、物事を修正します。また、 'stderr'ではなく' stderr'に 'perror()'のメッセージが表示されますが、違いは見つけにくいです。アサーションが発生しなければ、あなたの 'あらゆる種類の初期化を省略しました'というコードはおそらく代わりに問題を引き起こしています。頻繁に行って、client_sockを印刷してください。 –