Socket實現通信

1.創(chuàng)建socket套接字

structaddrinfohints, *res =NULL, *aip =NULL;

hints.ai_family=AF_UNSPEC;

if(bIsUDP)

{

hints.ai_socktype=SOCK_DGRAM;

hints.ai_protocol=IPPROTO_UDP;

}

else

{

hints.ai_socktype=SOCK_STREAM;

hints.ai_protocol=IPPROTO_TCP;

}

將ip轉化為地址結構體

in_addr addr = {0};

intret =inet_pton(AF_INET, pHost, &addr);

//創(chuàng)建socket

if(ret >0) {

hSocket =socket(AF_INET, hints.ai_socktype, hints.ai_protocol);

if(-1== hSocket) {

returnhSocket;

}

//綁定服務器地址

sockaddr_inbind_addr = {0};

bind_addr.sin_family=AF_INET;

bind_addr.sin_addr= addr;

nRet=::bind(hSocket,(conststructsockaddr*)&bind_addr,sizeof(bind_addr));


//設置socket接受/發(fā)送參數

structlinger ling;

ling.l_linger=0;

ling.l_onoff=1;

nRel =setsockopt(hSocket,SOL_SOCKET,SO_LINGER, (char*)&ling,sizeof(ling));

//設置接受和發(fā)送buffer大小

intnRcvBufSize =512*1024;

nRel=setsockopt(hSocket,SOL_SOCKET,SO_RCVBUF,(char*)&nRcvBufSize,sizeof(nRcvBufSize));

intnSendBufSize =512*1024;

nRel=setsockopt(hSocket,SOL_SOCKET,SO_SNDBUF, (char*)&nSendBufSize,sizeof(nSendBufSize));

//設置socket是否是阻塞模式 設置0為非阻塞? 1為阻塞

SetSocketBlock(hSocket,0);

//連接

sockaddr_inskAddr = {0};

skAddr.sin_family=AF_INET;

skAddr.sin_addr= addr;

skAddr.sin_port=htons(nPort);

nConnectRet=connect(hSocket, (sockaddr*)&skAddr,sizeof(skAddr));

//設置select超時等socket事件

fd_setfdwrite;

fd_setfdread;

fd_setfdexcept;

FD_ZERO(&fdwrite);

FD_ZERO(&fdread);

FD_ZERO(&fdexcept);

FD_SET(fd,&fdwrite);

FD_SET(fd,&fdread);

FD_SET(fd,&fdexcept);

__int64t1 =GetTickCount();

__int64t2 = nTimeOut *1000;

structtimevaltimeout;

timeout.tv_sec=0;

timeout.tv_usec=500*1000;

while(1)

{

intret =select(fd+1,&fdread,&fdwrite,&fdexcept,&timeout);

if(ret == -1)

{

return-3000002;

}

if(ret >0)

{

if(FD_ISSET(fd,&fdread))

{

interror;

socklen_tlen =sizeof(error);

ret =getsockopt(fd,SOL_SOCKET,SO_ERROR, &error, &len);

fLog(FC_LOG_Major,"CCSInf: socketCanReadWrite, fdread ret=%d", ret);

if(ret <0)

return-1;

return0;

}

elseif(FD_ISSET(fd,&fdwrite))

{

interror;

socklen_tlen =sizeof(error);

ret =getsockopt(fd,SOL_SOCKET,SO_ERROR, &error, &len);

if(ret <0)

return-1;

return0;

}

elseif(FD_ISSET(fd,&fdexcept))

{

fLog(FC_LOG_Major,"CCSInf: socketCanReadWrite, fdexcept ret=%d", -3000003);

return-3000003;

}

}

if((GetTickCount() - t1 > t2))break;

Sleep(10);

}


//ssl設置寫

nHaveWrite=0;

while((nHaveWrite

{

if(m_sockfd!=-1)

{

/*設置select超時事件*/

}

else

{

return-2110001;

}

if(nErrorCode!=0)

{

close(m_sockfd);

m_sockfd=-1;

return-2110002;

}

char*pWritePos=pMsg+nHaveWrite;

intret = -1;

ret =SSL_write(m_pssl, (void*)pWritePos, nLen - nHaveWrite);

if(ret<=0)

{

interr =SSL_get_error(m_pssl,ret);

Reset();

return-2110003;

}

nHaveWrite+=ret;


}

//收數據

std::stringbuf(10240,0);

intnTotal=buf.size();

intnRecvTotal =0;

out.clear();

do

{

if(m_sockfd!=-1)

{

/*設置select超時事件*/

}

else

{

return-2110001;

}

if(nErrorCode!=0)

{

close(m_sockfd);

m_sockfd=-1;

return-2110002;

}

intret = -1;

ret =SSL_read(m_pssl, &buf[0], nTotal - nRecvTotal);

if(0== ret)break;

if(ret >0)

{

buf[ret] =0;

nRecvTotal += ret;

if(nRecvTotal >= nTotal) {

out.append(buf.c_str());

buf.clear();

buf.resize(10*1024);

nTotal += buf.size();

continue;

}

out.append(buf.begin(), buf.begin() + ret);

if(out.rfind("") !=std::string::npos)break;

}else{

}

}while((nRecvTotal < nTotal) && (bExit ==false));

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市令花,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異壶笼,居然都是意外死亡,警方通過查閱死者的電腦和手機雁刷,發(fā)現死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門覆劈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事责语∨谡希” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵坤候,是天一觀的道長胁赢。 經常有香客問我,道長白筹,這世上最難降的妖魔是什么智末? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮徒河,結果婚禮上系馆,老公的妹妹穿的比我還像新娘。我一直安慰自己顽照,他們只是感情好由蘑,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棒厘,像睡著了一般纵穿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢人,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天谓媒,我揣著相機與錄音,去河邊找鬼何乎。 笑死句惯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的支救。 我是一名探鬼主播抢野,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼各墨!你這毒婦竟也來了指孤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贬堵,失蹤者是張志新(化名)和其女友劉穎恃轩,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體黎做,經...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叉跛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了蒸殿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筷厘。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸣峭,死狀恐怖,靈堂內的尸體忽然破棺而出酥艳,到底是詐尸還是另有隱情摊溶,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布玖雁,位于F島的核電站更扁,受9級特大地震影響,放射性物質發(fā)生泄漏赫冬。R本人自食惡果不足惜浓镜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劲厌。 院中可真熱鬧膛薛,春花似錦、人聲如沸补鼻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风范。三九已至咨跌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硼婿,已是汗流浹背锌半。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寇漫,地道東北人刊殉。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像州胳,于是被迫代替她去往敵國和親记焊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內容