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下是#include
int 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
測試
bind
、listen
和accept
都是伺服器端用的函式,客戶端用的就只需要乙個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...