我很難理解對非常規檔案(例如 stdin/out、socket、device)的讀寫是如何作業的。我有以下客戶端/服務器程式。
客戶
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int sockfd = 0, n = 0;
int recvBuff[1024];
struct sockaddr_in serv_addr;
if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff))) > 0)
{
printf("num of bytes read %d\n", n );
recvBuff[n] = 0;
for (int i = 0; i < n; i )
{
printf("%x", recvBuff[i]);
}
}
if(n < 0)
{
printf("\n Read error \n");
}
return 0;
}
服務器
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
int sendBuff[] = {0x27, 0x3f, 0x5a };
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
write(connfd, sendBuff, 3);
close(connfd);
sleep(1);
}
}
問題是,如果我將要在服務器端發送的資料大小設定為 9 以上。客戶端顯示 27、3f、5a,但還有 6 個其他零。如果我將 write() 上的資料大小設定為 3,那么客戶端將顯示帶有兩個零的 0x27。
你能告訴我我做錯了什么嗎?提前致謝。


uj5u.com熱心網友回復:
int sendBuff[] = {0x27, 0x3f, 0x5a };
在你的平臺上 int 是 4 個位元組,如果它是小端在記憶體中看起來像這樣:
十六進制:27 00 00 00 3f 00 00 00 5a 00 00 00
前四個位元組,相當于你的 int,是 27 00 00 00
所以當您的服務器嘗試寫入時:
write(connfd, sendBuff, 3);
它將在 sendBuff 中發送第一個 3 個位元組,即 27 00 00
如果您將 sendBuff 陣列更改為 char 或 unsigned char,那么您的寫入將按預期作業。
uj5u.com熱心網友回復:
感謝 Igor Tandetnik 指出這一點,我想出了我需要做的事情。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393270.html
上一篇:陣列b等于陣列元素a的位數之和
