cocos2d-x 基於BSD Socket網絡通訊模塊小結

1. 預備知識:

線程,互斥鎖,信號量: 

複製代碼
 //創建一個線程 
 int pthread_create(pthread_t *restrict tidp, 
                                 const pthread_attr_t *restrict attr, 
                                 void *(*start_rtn)(void),
                                 void *restrict arg);
//初始化互斥量
 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex-attr_t *mutexattr);
//給互斥量上鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
//給互斥量解鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//信號量初始化
int sem_init(sem_t *sem, int pshared, unsigned int value);
//發送信號量
int sem_post(sem_t *sem);
//等待信號量
int sem_wait(sem_t *sem);
複製代碼

BSD Socket: 

複製代碼
//創建一個socket連接
int socket (int family, int type, int protocol);
//連接目標主機
int connect(int s, const struct sockaddr *name, int namelen);
//關閉socket連接
 int close(int fildes);
//發送內容
ssize_t send(int s, const void *msg, size_t len, int flags);
//接收內容
ssize_t recv(int s, void *buf, size_t len, int flags);
複製代碼

2. WIN32平臺注意事項

1) 在鏈接器加入附加依賴項pthreadVCE2.lib.

2) 用以下代碼對網絡進行初始化,退出時進行清除.

//初始化, 放在網絡使用之前
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData)

//清除網絡使用, 放在網絡使用完畢之後.
WSACleanup()

3) 線程使用需要初始化, 退出時進行清除.

//線程使用之前,初始化線程
pthread_win32_process_attach_np();  
//線程使用之後,清除線程使用
pthread_win32_process_detach_np();

4) 關閉連接使用closesocket而非close.

5) 解析IP地址時,使用inet_addr, 詳細如下:

複製代碼
const char *addr = "192.168.1.1";
struct in_addr ip = {0};
#ifdef WIN32 
ip.s_addr = inet_addr(addr);
if(ip.s_addr == INADDR_NONE)
{
    CCLOG("can't parse IP address %s", addr);        
}
#else 
if (!inet_aton(addr, &ip))
{
    CCLOG("can't parse IP address %s", addr);
}
#endif
struct hostent *host;
host = gethostbyaddr((char *) &ip, 4, AF_INET);
複製代碼

6) 判斷主機連接是否關閉, 在此模塊中本人使用recv返回值來判斷連接是否被主機關閉, Win32和其他平臺迥異的是recv返回0爲主機關閉連接, 而其他平臺(ios, android)返回-1爲主機關閉連接.

3. ios平臺注意事項

 1) 調試發現, ios平臺sem_init總是返回-1, 網上求證得知可能由於ios不支持無名信號量導致, 使用以下方式用以代替sem_init.

//獲取及初始化信號量
sem_t *my_sem;
my_sem = sem_open("/mysem1", O_CREAT,0664,0);

//使用sem_open方式創建的信號量在使用完畢需清除.
sem_unlink("/mysem1");

4. android平臺注意事項

1)記得在AndroidManifest.xml中加上網絡使用權限.

<uses-permission android:name=”android.permission.INTERNET”></uses-permission>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章