Cを使用してサーバーアプリケーションに文字列を送信しようとしていますが、私はかなりネットワークプログラミングに新しいです、私は自分のコードが間違ったツリーを吠えていると思います。バッファの長さとバッファのソケット上での送信
メッセージは、メッセージの長さ+メッセージであるとすると、(生着信データであるbufを)などのPythonのサーバによって反対側に展開される:
msg_len_bytes = buf[0:4]
msg_len = struct.unpack("!L", msg_len_bytes)[0]
!ネットワークのバイトオーダーを意味し、Lは符号なしlongを意味します。
通常の文字列を送信するのはかなり簡単です。 send(sock、message、strlen(message)、0);
しかし、メッセージの長さを追加すると、私はかなりハンドルを得ることができません。ここでは、これまでに私のクライアントのためのコードです:
struct msgstruct {
uint32_t length;
char send_data[4096];
};
int main()
{
int sock;
struct msgstruct message;
char data[4096] = "<MOP><test/></MOP>";
for (int i = 0; i < strlen(data); i++) {
message.send_data[i] = data[1];
}
struct hostent *host;
struct sockaddr_in server_addr;
unsigned long buflen = sizeof(message.send_data);
uint32_t bufsend = htonl(buflen);
message.length = bufsend;
host = gethostbyname("127.0.0.1");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12998);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1) {
perror("Connect");
exit(1);
}
if(send(sock, message.length + message.send_data, sizeof(message), 0) == -1){
printf("\nSocket error.");
exit(1);
}
return 0;
}
私はいくつかのバリエーションを試してみたが、私は常にソケットエラーで終わります。それは送信のための2番目の引数で型を混合しているからですか?私は構造体を送信しようとするとコンパイルエラーが発生します。
あなたが提供する答えに満足している場合は、チェックマークと「正解」として(私の願わくば!)ものを選択してください。それは15の報酬の価値がある。私のことを指摘し、今後の参考文献でこの質問をより有効にしています。 – abelenky