[問題] C SOCKET 卡住 Help!!!

看板C_and_CPP (C/C++)作者 (Center)時間12年前 (2014/01/04 01:19), 編輯推噓3(305)
留言8則, 5人參與, 最新討論串1/1
各位高手好!!! 想請益,我自己在寫C Socket 時 我有Server-Cliner連線,當Server send 1個byte資料時 過一段時間Client才收到,又有時候會一傳送馬上收到!!! 還有另外一種狀況是,我 recv 速度很快收到好幾筆資料後(正常應該要這樣子) 但又卡住一陣子,又感覺順了連續收到好幾筆,之後又卡住一段時間沒收到東西 之後又收到連續幾筆後又卡住了!!! 請問有這種經驗的大大嗎 可以分享一下大概是哪方面出了問題 以下提供 我自己寫的 有怪怪的地方請指正 因為是這方面新手 都剪剪貼貼!! Server 端 CODE 網址 http://codepad.org/CxpgQkSH Client 端 CODE 網址 http://codepad.org/yoinQcP0 以下為Client端 Code //--------------------------------- for(;;){ if((sockfd = socket(AF_INET, SOCK_STREAMNC, IPPROTO_TCP)) < 0)goto leave; bzero( &serv_addr, sizeof(struct sockaddr_in) ); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(2400); serv_addr.sin_len = sizeof( serv_addr ); serv_addr.sin_addr.s_addr = inet_addr(SERVIP); testarg=2; if(connect(sockfd, (PSA)&serv_addr, sizeof(serv_addr)) != 0)goto leave; Slavetimeout.tv_sec = 0 ; Slavetimeout.tv_usec = 5 ; setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&Slavetimeout,sizeof(Slavetimeout)); setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&Slavetimeout,sizeof(Slavetimeout)); for(;;){ if( recv( sockfd, clientflagC, 1, 0 ) <= 0 )goto leave ; if( recv( sockfd,TraceObjectMC, 1, 0 ) <= 0 )goto leave ; if( send( sockfd,TraceObjectSC, 1, 0 ) <= 0 )goto leave ; if(clientflagC[0]==2){ //同步控制----------------------- SynTimeC[0]=2; if( send( sockfd, SynTimeC, 1, 0 ) <= 0 )goto leave ;//連線建立準備同步 *Clientptr=0; clientflagC[0]=0; goto leave; }//end2 if(clientflagC[0]==3){ if(SendObjArgindexCount<= RSendObjArgindexCount){ SendObjArg[0]=RSendObjArg[SendObjArgindex][0]; SendObjArg[1]=RSendObjArg[SendObjArgindex][1]; SendObjArg[2]=RSendObjArg[SendObjArgindex][2]; if( send( sockfd, SendObjArg, 3, 0 ) <= 0 ) { goto leave ; } SendObjArgTime[0]=RSendObjArgTime[SendObjArgindex][0]; SendObjArgTime[1]=RSendObjArgTime[SendObjArgindex][1]; SendObjArgTime[2]=RSendObjArgTime[SendObjArgindex][2]; if( send( sockfd, SendObjArgTime, 3, 0 ) <= 0 ) { goto leave ; } SendObjArgXY[0]=RSendObjArgXY[SendObjArgindex][0]; SendObjArgXY[1]=RSendObjArgXY[SendObjArgindex][1]; SendObjArgXY[2]=RSendObjArgXY[SendObjArgindex][2]; if( send( sockfd, SendObjArgXY, 3, 0 ) <= 0 ) { goto leave ; } SendObjArgindexCount++; if(SendObjArgindex<99)SendObjArgindex++; else SendObjArgindex=0; } }//end 3 } leave: shutdown(sockfd,2); fdClose( sockfd ); sockfd = INVALID_SOCKET; //TaskBlock( TaskSelf() ); //fdCloseSession( (HANDLE)TaskSelf() ); }//end for 排版有點爛!! 抱歉 困擾我好久 希望大大指點!!! 或私下教我 感謝!~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.224.76.92

01/04 01:27, , 1F
附上 CODE 網址 http://codepad.org/yoinQcP0
01/04 01:27, 1F
※ 編輯: Liang8057 來自: 36.224.76.92 (01/04 01:29) ※ 編輯: Liang8057 來自: 36.224.76.92 (01/04 01:34)

01/04 10:11, , 2F
TCP本就不保證send的資料會立即送出 http://0rz.tw/ymaJQ
01/04 10:11, 2F

01/04 10:14, , 4F
01/04 10:14, 4F

01/04 13:55, , 5F
大大需要的是Event-Driven,歡迎跳進Libevent的深坑((
01/04 13:55, 5F

01/04 13:55, , 6F
((邪笑
01/04 13:55, 6F

01/06 10:51, , 7F
設定 NO DELAY flag呢?
01/06 10:51, 7F

01/10 17:12, , 8F
Server要不要改用fork或pthread處理每個連線
01/10 17:12, 8F
文章代碼(AID): #1Inl4qI_ (C_and_CPP)
文章代碼(AID): #1Inl4qI_ (C_and_CPP)