在一家小公司,任務也不多,主管也沒教,好不容易來了乙個socket斷線重連的任務,於是自己寫了一下。寫的很爛,希望多多包涵,我是個新手,才剛剛上路,希望大家多多指教。
公司的硬體是乙個可以gsm傳資料的盒子,通過socket把資料傳到遠端伺服器,主管寫了程式,斷線重連的功能教給我完成。這是我的第乙個程式。
#include
#include
void *subthread();
main()
void *subthread()
fcntl(sd, f_setfl, o_nonblock);//set up to nonblock.
perror("fcntl");
h = (struct hostent *) gethostbyname((char *)"61...28");
remoteservaddr.sin_family = af_inet;
remoteservaddr.sin_port = htons(9999);
remoteservaddr.sin_addr.s_addr = inet_addr(serv_addr);
bzero(&(remoteservaddr.sin_zero),8);
rc = sendto(sd, sendbuf, sumlen+2, 0,(struct sockaddr *) &remoteservaddr,sizeof(remoteservaddr));
if(rc<0)
timeout.tv_sec = sendstruct->rtimeout;
timeout.tv_usec = 0;
fd_zero(&fdr);
fd_set(sd, &fdr);
switch (select(sd + 1, &fdr, null,null, &timeout))
case 0:
break;
}default:
if (fd_isset(sd,&fdr))
}//switch*/
}框架在這裡,我原想著只是重新建立乙個socket就可以了,但是遠遠不是這樣,首先要埠復用。然後原來的socket被close掉了以後,我新建的socket控制代碼還是和原來的socket控制代碼一樣,都是5.在短時間內重新連是連不上的。而我的盒子要求長連線和短時間迅速重連。我在乙個時間只有乙個socket,這不能達到要求。於是我做出了如下的修改。
#include
#include
main()
void *subthread()
else
vv = close(sd);
sd = sa;//change socket id; }}
首先新建乙個socket,然後再關掉原來的socket,這樣socket id就不會重複,socket id 在5和6之間切換,可以讓2msl變成1msl。而且只使用1個socket進行通訊。
寫的不好,因為實在是不知道udp的斷線重連應該怎麼連,這裡要求的是斷線要立刻連線上,以免資料丟失,而且連線上了就是很長時間,因為是嵌入式環境。
寫完了程式,中國部這邊就不寫code了,公司真是小啊。我的程式也沒人去看了。但是我會繼續學習網路程式設計,我的目標是tiro,我想以後也投身協議,投身ic設計中去。我還要努力。謝謝。
websocket 斷線重連
摘要websocket reconnect websocket是html5發布之後出現的一種新技術,說它是新技術,其實也不是多新的技術了,因為畢竟也有2 3年了,但是找了很多國內的例項,缺發現不多,不知道是它不好用呢,還是說這種技術原來就有缺陷呢,咱們暫且不說,今天我們就來介紹一下websocket...
斷線重連機制
zookeeper的客戶端具有自動重連機制,當出現網路異常時,客戶端會自動重連直到與集群中的某台機器連線成功,連線過程如下圖所示 1.網路異常情況包括網路閃斷 zk伺服器宕機等情況,這會導致連線斷開connection loss,此時客戶端會收到事件none disconnected 2.如果在se...
TCP斷線重連
struct sockaddr in tempsadd tempsadd.sin family af inet tempsadd.sin port htons m serverport tempsadd.sin addr.s addr inet addr m serverip.c str if 1 ...