Android NDK中socket的用法以及注意事項(xiàng)分析
更新時(shí)間:2013年06月15日 17:05:19 作者:
本篇文章是對(duì)Android NDK中socket的用法以及注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
Android NDK中使用socket的整個(gè)過程分為以下幾部分:
第一部分: 創(chuàng)建socket并綁定IP和端口
#include <sys/select.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_DATA_BUF_LEN 10240
int sd = INVALID_SOCKET;
sockaddr_in addr_org; // 發(fā)送端地址
sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 創(chuàng)建socket
addr_org.sin_family = AF_INET;
addr_org.sin_addr.s_addr = inet_addr("192.128.0.1"); // 發(fā)送端IP
addr_org.sin_port = htons(8080); // 發(fā)送端端口
bind(sd, (struct sockaddr *)&(addr_org), sizeof(struct sockaddr_in)); // 綁定IP和端口
第二部分: 發(fā)送數(shù)據(jù)
sockaddr_in addr_dst; // 接收端地址
addr_dst.sin_family = AF_INET;
addr_dst.sin_addr.s_addr = inet_addr("192.128.0.2"); // 接收端IP
addr_dst.sin_port = htons(8080); // 接收端端口
... // 生成要發(fā)送的數(shù)據(jù)到SendDataBuff, 長(zhǎng)度為ulLen
sendto(sd, SendDataBuff, ulLen, 0, (struct sockaddr *)&(addr_dst), sizeof(sockaddr_in)); // 發(fā)送SendDataBuff中的數(shù)據(jù)
第三部分: 在線程中接收數(shù)據(jù)(非阻塞式)
void *SocketReceiveThread(void *pParam)
{
fd_set fdset;
struct timeval delayval;
unsigned long lRetVal;
delayval.tv_sec = 0;
delayval.tv_usec = 5000; /*5ms延時(shí)*/
while (!end_flag)
{
FD_ZERO(&fdset);
FD_SET(sd, &fdset);
lRetVal = select(sd+1, &fdset, NULL, NULL, &delayval); // 尤其要注意第一個(gè)參數(shù)
if (0 == lRetVal)
{
continue;
}
else if (SOCKET_ERROR == lRetVal)
{
break;
}
else if (FD_ISSET(sd, &fdset) != 0)
{
char RecvDataBuff[MAX_DATA_BUF_LEN]; // 接收數(shù)據(jù)buffer
unsigned long ulLen = recvfrom(sd, RecvDataBuff, MAX_DATA_BUF_LEN, 0, NULL, NULL);
... // 處理接收到的數(shù)據(jù)
}
}
}
第四部分: 關(guān)閉socket
close(sd);
第一部分: 創(chuàng)建socket并綁定IP和端口
復(fù)制代碼 代碼如下:
#include <sys/select.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_DATA_BUF_LEN 10240
int sd = INVALID_SOCKET;
sockaddr_in addr_org; // 發(fā)送端地址
sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 創(chuàng)建socket
addr_org.sin_family = AF_INET;
addr_org.sin_addr.s_addr = inet_addr("192.128.0.1"); // 發(fā)送端IP
addr_org.sin_port = htons(8080); // 發(fā)送端端口
bind(sd, (struct sockaddr *)&(addr_org), sizeof(struct sockaddr_in)); // 綁定IP和端口
第二部分: 發(fā)送數(shù)據(jù)
復(fù)制代碼 代碼如下:
sockaddr_in addr_dst; // 接收端地址
addr_dst.sin_family = AF_INET;
addr_dst.sin_addr.s_addr = inet_addr("192.128.0.2"); // 接收端IP
addr_dst.sin_port = htons(8080); // 接收端端口
... // 生成要發(fā)送的數(shù)據(jù)到SendDataBuff, 長(zhǎng)度為ulLen
sendto(sd, SendDataBuff, ulLen, 0, (struct sockaddr *)&(addr_dst), sizeof(sockaddr_in)); // 發(fā)送SendDataBuff中的數(shù)據(jù)
第三部分: 在線程中接收數(shù)據(jù)(非阻塞式)
復(fù)制代碼 代碼如下:
void *SocketReceiveThread(void *pParam)
{
fd_set fdset;
struct timeval delayval;
unsigned long lRetVal;
delayval.tv_sec = 0;
delayval.tv_usec = 5000; /*5ms延時(shí)*/
while (!end_flag)
{
FD_ZERO(&fdset);
FD_SET(sd, &fdset);
lRetVal = select(sd+1, &fdset, NULL, NULL, &delayval); // 尤其要注意第一個(gè)參數(shù)
if (0 == lRetVal)
{
continue;
}
else if (SOCKET_ERROR == lRetVal)
{
break;
}
else if (FD_ISSET(sd, &fdset) != 0)
{
char RecvDataBuff[MAX_DATA_BUF_LEN]; // 接收數(shù)據(jù)buffer
unsigned long ulLen = recvfrom(sd, RecvDataBuff, MAX_DATA_BUF_LEN, 0, NULL, NULL);
... // 處理接收到的數(shù)據(jù)
}
}
}
第四部分: 關(guān)閉socket
close(sd);
您可能感興趣的文章:
- Android Studio 導(dǎo)入開源項(xiàng)目的正確姿勢(shì)及注意事項(xiàng)
- Android Studio3.0升級(jí)后使用注意事項(xiàng)及解決方法
- Android 程序執(zhí)行Linux命令的解決方法及注意事項(xiàng)
- 將Eclipse工程轉(zhuǎn)Android Studio工程的步驟與注意事項(xiàng)
- AndroidStudio升級(jí)到3.0的新特性和注意事項(xiàng)小結(jié)
- 詳解Android Service 使用時(shí)的注意事項(xiàng)
- Android 中ViewPager中使用WebView的注意事項(xiàng)
- Android TimerTask 的簡(jiǎn)單應(yīng)用及注意事項(xiàng)
- Android 如何使用log4j及注意事項(xiàng)
- Android集成百度地圖開發(fā)流程和注意事項(xiàng)
- Android onNewIntent()觸發(fā)機(jī)制及注意事項(xiàng)
- Android Studio添加第三方庫(kù)的注意事項(xiàng)
- Android 程序申請(qǐng)權(quán)限注意事項(xiàng)
- Android Service自啟動(dòng)注意事項(xiàng)分析
- 關(guān)于Android WebView的loadData方法的注意事項(xiàng)分析
- Android生存指南之:開發(fā)中的注意事項(xiàng)
- Android 編程下字庫(kù)的使用及注意事項(xiàng)
- 60條Android開發(fā)注意事項(xiàng)與經(jīng)驗(yàn)總結(jié)
相關(guān)文章
Android自定義控件之可拖動(dòng)控制的圓環(huán)控制條實(shí)例代碼
這篇文章主要介紹了Android自定義控件之可拖動(dòng)控制的圓環(huán)控制條實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Android7.0版本影響開發(fā)的改進(jìn)分析
這篇文章主要介紹了Android7.0版本影響開發(fā)的改進(jìn),總結(jié)分析了Android7.0版本中比較常見的開發(fā)注意事項(xiàng)與操作技巧,需要的朋友可以參考下2017-11-11
Android自定義日歷Calender代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android自定義日歷Calender實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android屏幕適配工具類 Android自動(dòng)生成不同分辨率的值
這篇文章主要為大家詳細(xì)介紹了Android屏幕適配工具類,Android自動(dòng)生成不同分辨率的值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
Android實(shí)現(xiàn)多點(diǎn)觸摸操作
這篇文章主要介紹了Android實(shí)現(xiàn)多點(diǎn)觸摸操作,實(shí)現(xiàn)圖片的放大、縮小和旋轉(zhuǎn)等處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android?進(jìn)入Activity時(shí)如何禁止彈出軟鍵盤輸入法
這篇文章主要介紹了Android?進(jìn)入Activity時(shí)如何禁止彈出軟鍵盤輸入法,文章圍繞主題展開具體內(nèi)容,需要的小伙伴可以參考一下2022-05-05
Android?ScrollView實(shí)現(xiàn)滾動(dòng)超過邊界松手回彈
這篇文章主要為大家詳細(xì)介紹了Android?ScrollView實(shí)現(xiàn)滾動(dòng)超過邊界松手回彈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
DrawerLayout的簡(jiǎn)單使用及側(cè)滑菜單實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了DrawerLayout的簡(jiǎn)單使用及側(cè)滑菜單實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

