線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1823
推到 Plurk!
推到 Facebook!

Socket傳結構的問題

答題得分者是:aftcast
比爾蓋子
一般會員


發表:10
回覆:16
積分:5
註冊:2009-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-20 11:41:24 IP:218.169.xxx.xxx 訂閱
我知道傳送的時候可以使用下面的方式傳送
我的struct宣告是這樣的
struct data *mystruct;

過程已經有給結構一些值了,然後進入socket傳送
sendto(s, (char*)&mystruct, len, 0, (SOCKADDR*) &m_localAddress, sizeof(m_localAddress));

但我在接收端卻接不回來
我有試過用

struct data *mystruct;
recvfrom(s, buf, bufSize, 0, (SOCKADDR*) &m_localAddress, &m_receiveAddrSz);
mystruct = (data *)buf;

但卻沒辦法還原傳送來的結構!!
請問我這樣的作法是否有錯???
編輯記錄
比爾蓋子 重新編輯於 2009-03-20 11:42:55, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-20 13:35:33 IP:163.28.xxx.xxx 訂閱
直接轉換的確是有可能發生問題,
建議還是自己轉換...
------
FPGA驗證, FPGA開發平台, http://smims.com
比爾蓋子
一般會員


發表:10
回覆:16
積分:5
註冊:2009-03-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-20 14:59:28 IP:140.127.xxx.xxx 訂閱
您好 不是很懂你的意思
是否可給一些例子以方便了解

===================引 用 ikk 文 章===================
直接轉換的確是有可能發生問題,
建議還是自己轉換...
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-20 15:02:44 IP:163.28.xxx.xxx 訂閱
資料結構傳送前先自行排進char * 陣列.
接收時再從char * 陣列一一取出.
------
FPGA驗證, FPGA開發平台, http://smims.com
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-20 20:56:47 IP:218.161.xxx.xxx 訂閱
先確定一下 bufSize >= sizeof(data)
然後再使用memcpy的方式來處理

struct data retstruct;
if(bufSize >= sizeof(data))
::memcpy(&retstruct, buf, sizeof(data));
else ... //這裡你想看看吧…

此時的 retstruct 應該會是你原來的,除非很少數的情形…




===================引 用 比爾蓋子 文 章===================
我知道傳送的時候可以使用下面的方式傳送
我的struct宣告是這樣的
struct data *mystruct;

過程已經有給結構一些值了,然後進入socket傳送
sendto(s, (char*)&mystruct, len, 0, (SOCKADDR*) &m_localAddress, sizeof(m_localAddress));

但我在接收端卻接不回來
我有試過用

struct data *mystruct;
recvfrom(s, buf, bufSize, 0, (SOCKADDR*) &m_localAddress, &m_receiveAddrSz);
mystruct = (data *)buf;

但卻沒辦法還原傳送來的結構!!
請問我這樣的作法是否有錯???
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
比爾蓋子
一般會員


發表:10
回覆:16
積分:5
註冊:2009-03-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-21 17:24:31 IP:140.127.xxx.xxx 訂閱
後來我改成
傳送端
sendto(s, (char*)&mystruct, sizeof(data), 0, (SOCKADDR*) &m_localAddress, sizeof(m_localAddress));
接收端
本來是
recvfrom(s, buf, sizeof(data), 0, (SOCKADDR*) &m_localAddress, &m_receiveAddrSz);
改成
recvfrom(s, (char*)&mystruct, sizeof(data), 0, (SOCKADDR*) &m_localAddress, &m_receiveAddrSz);
接收到的struct結果跟您說的用memcpy(&retstruct, buf, sizeof(data));的內容一樣
但他還是錯的!! 不知道為什麼??

===================引 用 aftcast 文 章===================
先確定一下 bufSize >= sizeof(data)
然後再使用memcpy的方式來處理

struct data retstruct;
if(bufSize >= sizeof(data))
::memcpy(&retstruct, buf, sizeof(data));
else ... //這裡你想看看吧…

此時的 retstruct 應該會是你原來的,除非很少數的情形…
比爾蓋子
一般會員


發表:10
回覆:16
積分:5
註冊:2009-03-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-15 13:04:37 IP:140.127.xxx.xxx 訂閱
自己來結案一下!!
果然是要用aftcast的方法
雖然說 一開始不是很懂前輩的意思
不過在看完對岸的文章寫出來後
回來此論壇才發現原來前輩的意思是這樣
我附上對岸比較完整的範例

http://www.9php.com/FAQ/cxsjl/c/2008/05/4301660118612.html
===================引 用 aftcast 文 章===================
先確定一下 bufSize >= sizeof(data)
然後再使用memcpy的方式來處理

struct data retstruct;
if(bufSize >= sizeof(data))
::memcpy(&retstruct, buf, sizeof(data));
else ... //這裡你想看看吧…

此時的 retstruct 應該會是你原來的,除非很少數的情形…




===================引 用 比爾蓋子 文 章===================
我知道傳送的時候可以使用下面的方式傳送
我的struct宣告是這樣的
struct data *mystruct;

過程已經有給結構一些值了,然後進入socket傳送
sendto(s, (char*)&mystruct, len, 0, (SOCKADDR*) &m_localAddress, sizeof(m_localAddress));

但我在接收端卻接不回來
我有試過用

struct data *mystruct;
recvfrom(s, buf, bufSize, 0, (SOCKADDR*) &m_localAddress, &m_receiveAddrSz);
mystruct = (data *)buf;

但卻沒辦法還原傳送來的結構!!
請問我這樣的作法是否有錯???
系統時間:2024-07-04 16:30:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!