伺服器發包到客戶端以登入包為例
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...