[英]Passing structure over a Socket from client to server
我需要編碼用於將文件從客戶端上傳到服務器。
在客戶端,我已經聲明了一個結構,
typedef struct upload_file
{
char *filename;
char *filebuffer;
}upload_file;
我從命令行參數獲取文件名。
在主要功能中,我正在使用結構變量分配文件名。
upload_file.filename = argv[1];
然后,我正在讀取文件內容,放入緩沖區並將其復制到結構的緩沖區值。
strcpy(upld.buffer,tmp); //tmp is a buffer which will contain the file content
之后,我將結構寫入套接字,如下所示:
write(sd, &upld, sizeof(upld));
這部分適合客戶端。 在服務器端,如果我閱讀了整個結構,又該如何分隔文件內容和文件名?
另外,來自客戶端的緩沖區值(即文件內容)已分配,並且可以用於服務器端嗎?
怎么辦呢?
提前致謝。
傳遞帶有指針的結構是沒有用的。 自己會通過,但他們不指向事發的指針。
您需要做的是封送數據以進行傳輸,而各種RPC機制(OPC,DCE等)都可以很好地完成這一工作。
如果您不能使用這樣的既定方法,則基本上是逐個結構地進行遍歷,然后將目標復制到目標緩沖區中。
例如,具有以下結構:
struct person {
int age;
char *name;
char *addr;
} p;
您可以執行以下操作:
msgbuff = outbuff = malloc (
sizeof (int) +
strlen (p.name) + 1 +
strlen (p.addr) + 1
);
if (msgbuff != NULL) {
*((int*)outbuff) = p.age; outbuf += sizeof (p.age);
strcpy (outbuff, p.name) ; outbuf += strlen (p.name) + 1;
strcpy (outbuff, p.addr) ; outbuf += strlen (p.addr) + 1;
// Send msgbuff
free (msgbuff);
} else {
// Some error condition.
}
請注意,由於int
在結構中,因此它是直接傳輸的。 對於字符指針(C字符串),您必須到達指針的目標,而不是指針本身。
本質上,您可以進行以下轉換:
p: age (46)
name (0x11111111) --> 0x11111111: "paxdiablo"
addr (0x22222222) --> 0x22222222: "Circle 9, Hades"
|--------------------|-------------------------------|
structure memory <- | -> other memory
變成:
msgbuff (0x88888888) -> {age}{"paxdiablo"}{"Circle 9, Hades"}
這使該過程有些復雜,因為您還必須在另一端進行封送處理,並且需要注意具有不同大小的int
類型的系統。 但這基本上就是完成的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.