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


水平有限, 敬請見諒------

最近cocos2d-x項目需求, 寫了個客戶端的基於TCP的網絡通訊模塊(ios, android, win32), 把使用到的東東和遇到的問題記錄下來.

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.

2014年4月23日更新:

使用有名信號量要特別注意,ios的有名信號量是全局的,也就是各個app之間不能使用相同的名稱,否則會引發沖突。建議使用當前時間戳作為信號量名稱。

//獲取及初始化信號量
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>

轉載請注明地址: http://www.cnblogs.com/just-live/archive/2012/04/28/socket_cocos2dx.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM