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ā)注意事項與經(jīng)驗總結
相關文章
Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼
這篇文章主要介紹了Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
Android自定義日歷Calender代碼實現(xiàn)
這篇文章主要為大家詳細介紹了Android自定義日歷Calender實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android屏幕適配工具類 Android自動生成不同分辨率的值
這篇文章主要為大家詳細介紹了Android屏幕適配工具類,Android自動生成不同分辨率的值,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03
Android?進入Activity時如何禁止彈出軟鍵盤輸入法
這篇文章主要介紹了Android?進入Activity時如何禁止彈出軟鍵盤輸入法,文章圍繞主題展開具體內容,需要的小伙伴可以參考一下2022-05-05
Android?ScrollView實現(xiàn)滾動超過邊界松手回彈
這篇文章主要為大家詳細介紹了Android?ScrollView實現(xiàn)滾動超過邊界松手回彈,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
DrawerLayout的簡單使用及側滑菜單實現(xiàn)詳解
這篇文章主要為大家介紹了DrawerLayout的簡單使用及側滑菜單實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

