藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

:oops: 使用TCP/UDP協議編寫一個客戶端程序,發送的指令格式為:
BS TYPE CRC
說明:
[b]BSC[/b] [i](1byte)[/i] [u]0x08[/u] [color=red](十六進制碼) [/color]
[b]TYPE[/b] [i](1byte)[/i] [u]0x00 [/u]
[b]CRC[/b] [i](2byte)[/i] [u]0xB0 0xC7 [/u]

請問發送這樣的指令代碼程序該如何按字節發送和接收呢?  
我只懂得按字符串發送,按字節該如何寫?
請各位高手不惜賜教! 小弟感激不盡
小弟真的很急需得到賜教,還請大家多多伸手相助!!!
:)

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

按字符串和按字節發送不都一樣嗎,
char s1[10] = "abcdefghi";
char s2[10] = {1,2,3,4,5,6,7,8,9,10};

然後sendto(s1,10...);  sendto(s2,10,...);

不知我說清楚了沒有?

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

如何轉化十六進制按字節發送??能否解釋一下?
字節發送和字符串發送有什麼不同?

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

簡單說說,例如
int I = 1;
char str[4];
在FreeBSD, 8x86下,int占4個字節,I 在內存中這樣表示
低端內存 0x00 <---- 第1字節
         0x00 <---- 2字節
                 0x00 <---- 3字節
高端內存 0x01 <---- 4字節

把一個 int 轉化十六進制按字節發送給對方,你只要你這4個字節發送過去就可以了。
sprintf(str, "%d", I);
write(socket, str, 4);

必要的話,還要考慮雙方 大端字節序 、小端字節序 的問題。

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

UDP通信是可以發送非可見字符信息的
如果發送的消息中包含CRC校驗的話,是不能轉換成可見字符的

可以這樣做:

char buf[4];

buf[0]=0x08;
buf[1]=0x00;
buf[2]=0xb0
buf[3]=0xc7

用sendto發送時指定發送長度為4即可。
sendto(sockid,buf,4,0,......)

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

如果是結構的話
一般會默認按4/8個字節對齊

如果想按一個字節對齊的話
那麼應該改變編譯器選項

如果是在UNIX下
那麼置頂的FAQ中有對編譯器對齊選項討論



結構的保存是一個連續的地址,這個連接地址可以看成是一個字符串流(當然沒有以\0結束)
使用socket函數可以直接發送(send recv等都有要發送的字節數)

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

可以用
int    i=1234;
char  buf[5];

memcpy((char *)buf,(char *)&amp;i,sizeof(i));
sendto(sockid,buf,4,...);
應該可以的

在TCP/UDP SOCKET程序中如何按字節發送和接收??《斑竹請進》

:lol:
  謝謝大家的指點,我自己再去試一試。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com