乙個包從伺服器到達客戶端

2022-03-15 03:49:27 字數 1850 閱讀 7346

伺服器發包到客戶端

以登入包為例

sendcmd(s2c_login, &ret, sizeof

(loginenum));

end_stat basechannel::sendcmd(

int ncmd, void* pdata, int

nlen)

send_stat basechannel::sendcmdtry()

}m_quecmd.pop();

//delete pkt.data;

m_pshare->pushpkt(pkt.pdata, pkt.nsize);//

釋放記憶體池

}

return

send_stat::send_succeed;

}send_stat datalayer::senddata(

int nchannelid, void* pdata, int

nsize)

在net主線程

for(;;)

}bool

netprocsvr::frommem2net()

if(!sharepkt.is_data)

}auto estate = m_sptcpserver->send_data(sharepkt.channel_id, sharepkt.data, sharepkt.size);

if(estate !=send_stat::send_succeed)

;itoa((

int)estate, buf, sizeof

(estate));

str +=buf;

messageboxa(nullptr, str.c_str(),

"send_data警告!

", mb_iconwarning);

std::cout

<< str <}

}return

true;}

//close_channel

bool libevtserver::close_channel(int

channel_id)

;

return

true;}

//對於這個函式有兩個疑問

//1.他到底是如何保證這個套接字有效的

到底還是主線程在傳送資料,這個和四個子執行緒什麼關係

send_stat libevtserver::send_data(int channel_id, void* data, int len) //

返回send_stat

}return

send_stat::send_succeed;

}bool

libevtserver::free_one_link()

if(offc2->c2)

if((gettickcount() - offc2->offtime) > 60*1000)//

一分鐘讓子執行緒操作完相關套接字,不然無效套接字select報錯

}return

false;}

//看看客戶端接收到包是如何處理的

如果伺服器bufferevent_write的時候客戶端的讀事件就會被呼叫,然後他會把它放到流裡面,然後從流中讀包

bool on_receive_data(int channel_id, void* data, int

len)

bool ngp::onrec(void* pbuffer, int

nsize)

return

true;}

//然後就是runonce呼叫不同的function,或者本來就傳遞乙個function過來,看來伺服器傳送乙個包過來也是很麻煩的

客戶端訪問伺服器的乙個例子

客戶端的程式要訪問伺服器,第一,加許可權 第二步 繼承activity實現runnable介面 public class mainactivity extends activity implements runnable new thread this start 第三步 伺服器端接收程式的寫法,m...

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...

UDP 客戶端伺服器

udp 客戶端 include include include include include define size 100 define ip 127.0.0.1 define port 10086 int main struct sockaddr in addr 建立socket udp so...