linux下socket上限,[100分]高分求关于linux socket上限解决方案
我想寫(xiě)一個(gè)復(fù)用socket的程序,以避免linux里socket最高上限的限制。因?yàn)槌绦蚴沁\(yùn)行在服務(wù)器端,只提高linux系統(tǒng)下的socket限制數(shù),是無(wú)法滿足我的需求。我的代碼如下,敬請(qǐng)各位大俠幫忙。
我遇到的問(wèn)題是:第一次能夠成功連接,并下載數(shù)據(jù);但是再次連接就無(wú)法連接上。
下面的這個(gè)函數(shù)是要無(wú)限循環(huán)運(yùn)行的。
code:
/*======================*/
BOOL?m3u8Parser(char?*url)?{
//m3u8sSocket是全局變量;
//m3u8stSvrAddrIn是全局變量;
char?sndBuf[1024]?=?{?0?};
char?rcvBuf[1024?*?20]?=?{?0?};
char?rcvBufswap[1024?*?20]?=?{?0?};
int?num?=?0,?len?=?0;
int?nRet?=?SOCKET_ERROR;
char?IPString[50]?=?{?0?};
char?http_HOST[1024]?=?{?0?};
char?http_GET[1024]?=?{?0?};
char?*ip?=?NULL;
char?path[1024]?=?{?0?};
char?filename[1024]?=?{?0?};
char?*tmp?=?NULL;
char?*content?=?NULL;
FILE*?fp?=?NULL;
time_t?tps,?tpe;
getHTTP_HOST(url,?http_HOST);
getHTTP_GET(url,?http_GET);
getIPString(url,?IPString);
//printf("m3u8Parser->getIPString:%sn",?IPString);
pthread_mutex_lock(&mutex);
if?((ip?=?get_IPURLLINKAGE_IP(pIPURLLink,?IPString))?==?NULL)?{
printf("m3u8Parser->pthread_mutex_lock:%sn",?ip);
if?((ip?=?GetIP(IPString))?==?NULL)?{
printf("m3u8Parser->GetIP->EXIT_FAILUREn");
pthread_mutex_unlock(&mutex);
return?FALSE;
}
if?(get_IPURLLINKAGE_counter(pIPURLLink)?>=?MAXIPNUMBER)
remove_ip_url_1st_node(pIPURLLink);
append_ip_url_link_node_trail(pIPURLLink,?new_ip_url_link_node(
IPString,?ip));
}
pthread_mutex_unlock(&mutex);
if?(createSaveDirectory(url,?path)?!=?0)?{
errorLoc?=?1;
printf("m3u8Parser?createSaveDirectoryn");
return?FALSE;
}
getFilename(url,?filename);
fp?=?fopen(filename,?"wt");
if?(fp?==?NULL)?{
errorLoc?=?1;
return?FALSE;
}
strcat(sndBuf,?http_GET);
strcat(sndBuf,?http_HOST);
//printf("%sn",?sndBuf);
#ifdef?WIN32
WSADATA?wsaData;
{
if?(WSAStartup(0x202,?&wsaData)?==?SOCKET_ERROR)
{
perror("WSAStartup");
return?FALSE;
}
}
#endif
m3u8stSvrAddrIn.sin_family?=?AF_INET;
m3u8stSvrAddrIn.sin_port?=?htons(80);
m3u8stSvrAddrIn.sin_addr.s_addr?=?inet_addr(ip);
if?(m3u8sSocket?==?-1)?{
m3u8sSocket?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);
printf("create?m3u8Parser?sSocket:%dn",?m3u8sSocket);
}
printf("m3u8Parser?sSocket:%dn",?m3u8sSocket);
nRet?=?connect(m3u8sSocket,?(SOCKADDR*)?&m3u8stSvrAddrIn,?sizeof(SOCKADDR));
if?(SOCKET_ERROR?==?nRet)?{
//errorLoc?=?1;
printf("?m3u8Saver?connect?fail!n");
goto?GOEND;
}
nRet?=?send(m3u8sSocket,?(char*)?sndBuf,?strlen(sndBuf),?0);
//printf("m3u8Parser?nRet:%dn",?nRet);
//----------------------------------------------
//??????while(1){
//處理接收到的數(shù)據(jù)。
}
//----------------------------------------------
shutdown(m3u8sSocket,?SHUT_WR);
//close(m3u8sSocket);
fclose(fp);
return?TRUE;
GOEND:
//printf("GOENDn");
#ifdef?WIN32
WSACleanup();
#endif
fclose(fp);
return?FALSE;
}
/*======================*/
|
你貼的是客戶端的代碼吧?能否連接那得看服務(wù)器在干啥了..
|
1、把socket設(shè)置成地址和端口都可以重復(fù)使用的試試。
2、不能連接的話,報(bào)的錯(cuò)誤是什么?
|
是不是你的服務(wù)器端發(fā)完數(shù)據(jù)后就close了啊?
這樣的話,client端需要重新connect。
|
樓主,是剛接觸Linux吧。linux里的描述字是不管你是不是釋放相應(yīng)的資源,都會(huì)往上漲,到了最大值后又從最小值開(kāi)始的。包括文件描述字也一樣。所以你可以創(chuàng)建一個(gè)長(zhǎng)連接,每次用非阻塞方式發(fā)送數(shù)據(jù)。
|
估計(jì)是你的服務(wù)器端發(fā)完數(shù)據(jù)后就close了啊?
這樣的話,client端需要重新connect。你好好檢查下。
|
程序崩潰和描述字到數(shù)字到最大是沒(méi)關(guān)系的,是你的內(nèi)存資源沒(méi)釋放,造成程序崩潰,描述字就相當(dāng)一個(gè)名字,它的本質(zhì)是一個(gè)數(shù)字,你用它去操作相應(yīng)的對(duì)象,但它和對(duì)象是不一樣的,對(duì)象是實(shí)的,描述字是虛的。
|
Using?open?source?library?-?ACE,?everything?will?be?ok!
|
該回復(fù)于2010-09-02 17:40:36被版主刪除
|
該回復(fù)于2010-09-02 17:41:13被版主刪除
|
幫頂,k不灌水
總結(jié)
以上是生活随笔為你收集整理的linux下socket上限,[100分]高分求关于linux socket上限解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓手机chroot linux,在An
- 下一篇: 兰州大学C语言程序设计课程作业,兰州大学