簡體   English   中英

如何將字符串加載到結構?

[英]How to load a string to a structure?

我有一個客戶端和一個服務器。 我使用UDP。 (C / Unix)

在服務器中,我確實有一個結構:

typedef struct Header {
int seqid;
int len;
char payload[100];
}
...
char test[100];
struct Header package;
package.seqid = 1;
package.len = 64;
strcpy(package.payload, test);
sendto(sockfd, &package, 100, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

在客戶端中,我確實具有相同的結構:

struct Header* myrepos;
...
recvfrom(sockfd, recvline, 100, 0, NULL, NULL);
//recvline is a char[100]
...

我想將提交的結構(由服務器提交)加載到“ myrepos”中。 我怎樣才能做到這一點?

用一個

*angel = (struct Header*)&recvline;

導致編譯器錯誤。

我不確定我的方法是否正確或是否會發生。 還有其他解決方案嗎?

謝謝!

1: sendto(sockfd, &package, sizeof(struct Header), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

2: recvline = new char [sizeof(struct Header)];

3: myrepos = (struct Header *)recvline;

我想您在這里遇到了幾個問題。

  1. 您為什么提到要發送的緩沖區大小為100? 假設您要始終發送100字節的有效負載,則它應該為sizeof(struct Header)。
  2. 如果您在網絡中按原樣發送整數變量,而在接收並在另一端分配它們時不將其轉換為“網絡順序”,則除非兩個機器的字節序相同,否則可能會得到不正確的值。

因此,我的建議是將它們全部轉換為緩沖區,並在接收到緩沖區並將其解碼為結構時將其發送出去。

記錄發送記錄的示例方法:

char sbuf[100] = {0};
char test[100] = {"Test Message"};
char *p = sbuf;
int bytestobesent = 0;

p = htonl(1);
p = p+sizeof(long);
p = htonl(64);
p = p+sizeof(long);
memcpy(p, test, strlen(test));

bytestobesent = sizeof(long) + sizeof(long) + strlen(test);

sendto(sockfd, sbuf, bytestobesent , 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr)); 

當您從網絡收到緩沖區時,只需執行相反的操作即可。 希望這可以幫助。

如果要發送固定大小的包裹。 然后這可能是解決方案:

服務器:

sendto(sockfd, &package, sizeof(package), 0, 
       (struct sockaddr*)&cliaddr, sizeof(cliaddr));

客戶:

struct Header myrepos;
...
recvfrom(sockfd, &myrepos, sizeof(myrepos), 0, NULL, NULL);

當然,您必須檢查函數的返回碼。

如果要發送可變大小的程序包,它將更加復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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