我正在構建一個應用程式 TCP 服務器客戶端,我想將二進制檔案發送到服務器/客戶端(所以我不想使用發送和接收),但我有一個問題,我想讀取我的客戶端的檔案描述符不作業我不明白為什么因為服務器正確接受客戶端所以我有這個功能:
bool accept_and_read_client(){
struct sockaddr_in new_client = { 0 };
socklen_t length = sizeof(new_client);
int val_return = accept(sock_fd, (struct sockaddr*)&new_client, &length);
if(val_return < 0){
syserr("error of accept");
return true;
}
printf("accept of client successful\n");
client_array[0].fd = val_return;
size_t nbread;
client_array[0].file = fdopen(client_array[0].fd, "w ");
nbread = fread(&val_return, sizeof(char), sizeof(MAX_BUFF), client_array[0].file);
if(nbread < -1){
syserr("fread");
return true;
}
printf("number i read : %ld\n", nbread);
return false;
}
當我啟動服務器時,服務器等待客戶端,當我進行 ./client 測驗時,服務器說:
accept of client successful
fread: Success
所以函式 fread 失敗了。
在 client.ci 上做這樣的 fwrite:
...
FILE* fdc = fdopen(sock_fd, "w ");
if(fdc == NULL){
syserr("error of fdopen");
return 1;
}
printf("%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");
}
如果您想查看客戶端結構:
struct client{
int fd;
// char buffer[MAX_BUFF];
FILE* file;
};
struct client client_array[MAX_CLIENTS];
如果有人知道為什么 fread 不起作用,請告訴我
uj5u.com熱心網友回復:
該fread功能可能不會失敗,而是您的檢查有缺陷:
size_t nbread;
...
if(nbread < -1)
該型別size_t是無符號的,因此當您nbread與-1該值進行比較時,它-1也會被轉換為無符號值。并且該無符號值將非常大,因此nbread將始終小于-1.
該fread函式不會回傳 -1或EOF出錯,而是會回傳一個小于 count 引數(第三個引數)的值。這是您需要檢查的條件(nbread < sizeof(MAX_BUFF)使用您當前顯示的可能錯誤的代碼)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389454.html
