我有一個帳戶結構(如銀行帳戶),我想在應用程式啟動時寫入“狀態”時將帳戶資訊發送給客戶端:./client state然后服務器必須發送客戶端資訊,但是我有用 fwrite 函式發送結構的問題,我已經在我的 server.c 上實作了這個
...
if(strcmp(buffer, "state") == 0) {
printf("sending the state of account...\n");
memcpy(buffer, &a1, sizeof(a1));
printf("%s\n", buffer);
size_t nb_write = fwrite(buffer, sizeof(char), sizeof(MAX_BUFF), client_array[0].file);
printf("number i write: %ld\n", nb_write);
if(fflush(client_array[0].file)){
syserr("error of fflush");
}
}
在我的 client.ci 上寫了這個:
...
if(argc > 1){
printf("argv[1]: %s\n", argv[1]);
size_t nb_write = fwrite(argv[1], sizeof(*argv), strlen(argv[1]), fdc);
printf("number i write: %ld\n", nb_write);
if(fflush(fdc)){
syserr("fflush");
}
}
size_t nbread = fread(&buffer, strlen(buffer), sizeof(BUFF_SIZE), fdc); // reception of structure
printf("number i read: %ld\n", nbread);
printf("%s\n", buffer);
應用程式客戶端正在等待 fread()
的輸出./server:
number i read: 4
state
sending the state of account...
account 1
number i write: 4
error of fflush: Illegal seek
當我按 CTRL-C 停止服務器時,應用程式客戶端會寫一些奇怪的東西(可能是緩沖區的內容)并且應用程式也在停止。
Socket creation successful
Connection successful !
argv[1]: state
number i write: 5
number i read: 0
??E-?
這里我想發送的結構:
struct account{
char title[MAX_TITLE_LENGTH];
struct user list_user[MAX_LIST_SIZE];
// char description[140]; // for example hotel, market, travel
int32_t total;
};
struct account a1;
/* ACCOUNT */
strcpy(a1.title, "account 1");
a1.list_user[0] = u1;
a1.total = 0.0;
我如何修復它以在客戶端的 fd 上正確發送結構并在客戶端的緩沖區中讀取它
uj5u.com熱心網友回復:
我在這段代碼中看到很多錯誤:
sizeof(MAX_BUFF)在服務器上fwrite()是錯誤的。您需要使用 justMAX_BUFF或sizeof(buffer)替代。sizeof(*argv)在客戶端fwrite()是錯誤的。*argv(又名argv[0])是一個char*,而不是一個char。您需要改用sizeof(char)ie1。客戶端沒有向服務器發送命令的空終止符或命令的長度,那么您如何期望服務器知道何時到達命令結尾?TCP 中的寫入和讀取之間沒有 1:1 的關系,因此您必須以一種或另一種方式考慮資料的實際大小。
當客戶端呼叫
fread(),&buffer,strlen(buffer), 和sizeof(BUFF_SIZE)都是錯誤的。雖然&buffer可能有效,但strlen(buffer)肯定不會,因為buffer尚未填充以空字符結尾的字串,因此您需要改用sizeof(char)ie1。并且sizeof(BUFF_SIZE)需要只是BUFF_SIZE或sizeof(buffer)相反。printf("%s\n", buffer);在客戶端和服務器中都是錯誤的,因為buffer顯然不是以空字符結尾的字串。即使客戶端不請求服務器發送它,客戶端也希望收到該結構。
話雖如此,請嘗試更像這樣的事情:
...
char *cmd = NULL;
size_t size;
ssize_t len;
if ((len = getdelim(&cmd, &size, '\0', client_array[0].file)) < 0) {
syserr("error of getdelim");
fclose(client_array[0].file);
}
else if (strcmp(cmd, "state") == 0) {
printf("sending the state of account...\n");
uint32_t size = htonl(sizeof(a1));
size_t nb_write = fwrite(&size, sizeof(size), 1, client_array[0].file);
if (nb_write == 1) {
nb_write = fwrite(&a1, sizeof(a1), 1, client_array[0].file);
}
if (nb_write < 1) {
syserr("error of fwrite");
fclose(client_array[0].file);
}
else {
printf("number i write: %ld\n", sizeof(size) sizeof(a1));
if (fflush(client_array[0].file) != 0) {
syserr("error of fflush");
}
}
}
free(cmd);
...
if (argc > 1) {
printf("argv[1]: %s\n", argv[1]);
if (fwrite(argv[1], strlen(argv[1]) 1, 1, fdc) < 1) {
syserr("error of fwrite");
fclose(fdc);
}
else if (fflush(fdc) != 0) {
syserr("fflush");
}
uint32_t size;
size_t nb_read = fread(&size, sizeof(size), 1, fdc);
if (nb_read == 1) {
size = ntohl(size);
nb_read = fread(buffer, size, 1, fdc);
}
if (nb_read < 1) {
syserr("error of fread");
fclose(fdc);
}
else {
printf("number i read: %ld\n", sizeof(size) size);
printf("%.*s\n", size, buffer);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/390841.html
上一篇:指標算術等價
