簡體   English   中英

通過套接字從客戶端到服務器傳遞結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM