Cocos2dx網路學習筆記(一)

2021-07-09 10:27:07 字數 4647 閱讀 4216

c++ socket 程式設計

直接上**,再一一解釋用到的東西

#include 

#include

#include

#include

#include

#include

using

namespace

std;

#define socket int

#define listenport 9999

int main()

struct sockaddr_in my_addr;

my_addr.sin_family = af_inet;

my_addr.sin_port = htons( listenport );

my_addr.sin_addr.s_addr = inaddr_any; /* inet_addr("127.0.0.1"); */

memset( my_addr.sin_zero, 0, 8 );

int result = ::bind( st, (struct sockaddr *) (&my_addr), sizeof(struct sockaddr) );

if ( result == -1 )

result = listen( st, 1 );

if ( result == -1 )

struct sockaddr_in new_addr;

socklen_t sin_size = sizeof(struct sockaddr_in);

socket new_connect = accept( st, (struct sockaddr *) (&new_addr), &sin_size );

if ( new_connect != -1 )

cout

<< "receive from client:"

<< buf << endl;

string message = buf;

message = "this is reply for " + message;

int reply_len = message.length();

int send_bytes = ::send( new_connect, message.c_str(), reply_len, 0 );

if ( send_bytes == -1 )}}

return

0;}

首先是標頭檔案:

#include 

#include

#include

#include

這幾個基本是常用的,其他常用的網路標頭檔案可以看這個 linux網路程式設計常用標頭檔案, windows下是#includeint socket(int domain, int type, int protocol);建立乙個socket,第乙個和第三個引數分別是域和協議,一般直接用這個就好,第二個引數是使用哪種協議,sock_stream是tcp,sock_dgram是udp的,返回值為-1表示建立失敗

struct sockaddr_in

這個結構體是為了更方便的處理sockaddr的,新增監聽、連線伺服器的相關配置都是這個結構體,兩者可以強轉,原型是

struct sockaddr_in ;*/

unsigned

char sin_zero[8]; /* 與sockaddr結構的長度相同*/

};

因為網路和本機的位元組順序不一樣,sin_port需要通過htons(host to network short)轉換, ip位址也需要轉換,不過可以使用專門的函式inet_addr("ip"),特別的,inaddr_any表示本機位址。sin_zero需要用memset或者bzero清零。

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

繫結埠,第1個引數是建立的socket;第二個引數可以用sockaddr_in,繫結哪個埠也是這個引數指定;addrlen直接用sizeof(struct sockaddr)。繫結失敗(如埠占用等)返回值為-1。

int listen(int sockfd, int backlog);

socket開始監聽,backlog表示最多可接收的連線數,可根據伺服器效能設定

int accept(int sockfd, void *addr, int *addrlen);

開始接聽後呼叫accept會阻塞,直至有乙個新連線到來。返回值是新連線的socket,你可以使用這個socket去接受和傳送訊息。void *addr可以獲取新連線的引數,如ip,埠等。後兩個引數跟bind類似。注意一點,獲取到的引數資訊是網路位元組順序,需要轉換成本機自己順序才可正確使用,ntohs(network to host short)和inet_ntoa

int recv(int sockfd, void *buf, int len, unsigned int flags);

接收sockfd的訊息,預設是阻塞式。新訊息內容將被儲存到buf, len是buf可儲存的最大數量,flags可設定為0,返回值是實際接收了多少資料。錯誤返回-1,斷開連線等通常返回0

int send(int sockfd, const void *msg, int len, int flags);

給sockfd傳送訊息,阻塞。msg是訊息內容,len是需要傳送的訊息長度,flags可設定為0.返回值是實際傳送了多少內容。

注意事項: std中也有recv和send函式,在recv前面加::可以表明是使用socket的recv。在using namespace std;的情況下要特別注意.

可以使用終端命令telnet 127.0.0.1 9999測試

bindlistenaccept都是伺服器端用的函式,客戶端用的就只需要乙個connect

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

建立socket完成後呼叫此函式,serv_addr是伺服器的位址和埠。錯誤返回-1

示例**:

#include 

#include

#include

#include

#include

#include

using

namespace

std;

#define socket int

#define listenport 9999

using

namespace

std;

int main(int argc, char *argv)

struct sockaddr_in server_addr;

server_addr.sin_family = af_inet;

server_addr.sin_port = htons( listenport );

server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");;

memset( server_addr.sin_zero, 0, 8 );

int result = connect(st, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr));

if (result == -1)

string message;

while (true)

char buf[1024];

int recv_bytes = ::recv( st, &buf, 1024, 0 );

if ( recv_bytes == -1 )

cout

<< "receive from server:"

<< buf << endl;

}return

0;}

伺服器 + telnet

伺服器 + 客戶端

cocos2d x 學習筆記 一

最近有點閒,突然想嘗試搞搞手機遊戲方面的開發,於是下了個cocos2d x 2.2.6和 cocos2d x權威指南 先看書,翻了下目錄尼瑪16章。厄,對於這種工具框架類的學習,貌似我從來沒有按部就班慢慢學的習慣 照例,花了2,3小時看下大概概念,記錄下 1,背景知識,過 2,環境搭建,cocos2...

cocos2d x學習筆記一選單

恢復內容開始 前沿 cocos2dx誇平台引擎算是越來也受寵了,網遊雖然用這個引擎次了點,但是輕量級的休閒遊戲還是比較靈活的。封裝的動作,選單,場景切換,例子特效等。網上很多教程都是基於1.0的,現在 必須基於1.0跑,所以在這裡筆者從2.0.3開始寫,保證大家能順利執行出來。結構圖如下 ccmen...

Cocos2d x學習筆記1

1.建立新的cocos2d x 3.0 專案 在命令列中輸入 cocos new helloworld 專案名稱 p com.ss.pku 包名字 l cpp 專案型別 d d cocos workspace 專案存放路徑 2.資料夾分析 resource 資料夾 存放資源檔案 include和so...