2012-05-14 32 views
0

我有一個客戶端和一個服務器。我使用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)); 

在客戶I做具有相同的結構:

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

欲加載到 「myrepos」 的提交的結構(由服務器提交)。 我該怎麼做?

使用

*angel = (struct Header*)&recvline; 

導致編譯器錯誤。

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

謝謝!

+0

假設天使是struct Header \ *天使。 angel =(struct Header \ *)recvline; – Angelom

回答

0

如果你想發送固定大小的包。那麼這可能是解決方案:

服務器:

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

客戶:

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

五言你必須檢查的函數的返回代碼。

如果你想發送可變大小的包,它會更復雜。

1

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;

+0

在編寫任何形式的通信協議時使用sizeof(struct_type)通常是一個糟糕的主意,因爲那意味着填充字節也會被髮送。 – Lundin

0

我猜你是這裏有幾個問題。

  1. 爲什麼你提到要發送的緩衝區大小爲100?它應該是sizeof(struct Header),假設你總是發送100個字節的有效載荷。
  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)); 

只要做到這相反,當你從網絡接收緩衝區。希望這可以幫助。

相關問題