Android NDK中socket的用法以及注意事項分析
更新時間:2013年06月15日 17:05:19 作者:
本篇文章是對Android NDK中socket的用法以及注意事項進行了詳細的分析介紹,需要的朋友參考下
Android NDK中使用socket的整個過程分為以下幾部分:
第一部分: 創(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, 長度為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延時*/
while (!end_flag)
{
FD_ZERO(&fdset);
FD_SET(sd, &fdset);
lRetVal = select(sd+1, &fdset, NULL, NULL, &delayval); // 尤其要注意第一個參數(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ù)
}
}
}
第四部分: 關閉socket
close(sd);
第一部分: 創(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, 長度為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延時*/
while (!end_flag)
{
FD_ZERO(&fdset);
FD_SET(sd, &fdset);
lRetVal = select(sd+1, &fdset, NULL, NULL, &delayval); // 尤其要注意第一個參數(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ù)
}
}
}
第四部分: 關閉socket
close(sd);
您可能感興趣的文章:
- Android Studio 導入開源項目的正確姿勢及注意事項
- Android Studio3.0升級后使用注意事項及解決方法
- Android 程序執(zhí)行Linux命令的解決方法及注意事項
- 將Eclipse工程轉Android Studio工程的步驟與注意事項
- AndroidStudio升級到3.0的新特性和注意事項小結
- 詳解Android Service 使用時的注意事項
- Android 中ViewPager中使用WebView的注意事項
- Android TimerTask 的簡單應用及注意事項
- Android 如何使用log4j及注意事項
- Android集成百度地圖開發(fā)流程和注意事項
- Android onNewIntent()觸發(fā)機制及注意事項
- Android Studio添加第三方庫的注意事項
- Android 程序申請權限注意事項
- Android Service自啟動注意事項分析
- 關于Android WebView的loadData方法的注意事項分析
- Android生存指南之:開發(fā)中的注意事項
- Android 編程下字庫的使用及注意事項
- 60條Android開發(fā)注意事項與經驗總結
相關文章
Android游戲開發(fā)實踐之人物移動地圖的平滑滾動處理
玩過rpg游戲的朋友應該都知道RPG的游戲地圖一般都比較大 今天我和大家分享一下在RPG游戲中如何來處理超出手機屏幕大小的游戲地圖。2014-06-06使用DrawerLayout組件實現(xiàn)側滑抽屜的功能
DrawerLayout組件同樣是V4包中的組件,也是直接繼承于ViewGroup類,所以說是一個容器類,下面通過本文給大家介紹使用DrawerLayout組件實現(xiàn)側滑抽屜的功能,感興趣的朋友一起看下吧2016-08-08Android開發(fā)實現(xiàn)的Intent跳轉工具類實例
這篇文章主要介紹了Android開發(fā)實現(xiàn)的Intent跳轉工具類,簡單描述了Intent組件的功能并結合實例形式給出了頁面跳轉、拍照、圖片調用等相關操作技巧,需要的朋友可以參考下2017-11-11Android應用開發(fā)中模擬按下HOME鍵的效果(實現(xiàn)代碼)
Android應用開發(fā)中, 有一種場景,就是我們不希望用戶直接按Back鍵退出Activity,而是希望應用隱藏到后臺,類似于按Home鍵的效果2013-05-05Android中實現(xiàn)OkHttp上傳文件到服務器并帶進度
本篇文章主要介紹了Android中實現(xiàn)OkHttp上傳文件到服務器并帶進度,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Android編程實現(xiàn)短信收發(fā)及語音播報提示功能示例
這篇文章主要介紹了Android編程實現(xiàn)短信收發(fā)及語音播報提示功能,結合實例形式分析了Android實現(xiàn)短信的接收、發(fā)送以及相應的語音播報提示功能相關操作技巧,需要的朋友可以參考下2017-08-08Android學習小結之Activity保存和恢復狀態(tài)
這篇文章主要介紹了Activity狀態(tài)保存和恢復的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08