linux下socket上限,[100分]高分求关于linux socket上限解决方案
我想寫一個復用socket的程序,以避免linux里socket最高上限的限制。因為程序是運行在服務器端,只提高linux系統下的socket限制數,是無法滿足我的需求。我的代碼如下,敬請各位大俠幫忙。
我遇到的問題是:第一次能夠成功連接,并下載數據;但是再次連接就無法連接上。
下面的這個函數是要無限循環運行的。
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){
//處理接收到的數據。
}
//----------------------------------------------
shutdown(m3u8sSocket,?SHUT_WR);
//close(m3u8sSocket);
fclose(fp);
return?TRUE;
GOEND:
//printf("GOENDn");
#ifdef?WIN32
WSACleanup();
#endif
fclose(fp);
return?FALSE;
}
/*======================*/
|
你貼的是客戶端的代碼吧?能否連接那得看服務器在干啥了..
|
1、把socket設置成地址和端口都可以重復使用的試試。
2、不能連接的話,報的錯誤是什么?
|
是不是你的服務器端發完數據后就close了啊?
這樣的話,client端需要重新connect。
|
樓主,是剛接觸Linux吧。linux里的描述字是不管你是不是釋放相應的資源,都會往上漲,到了最大值后又從最小值開始的。包括文件描述字也一樣。所以你可以創建一個長連接,每次用非阻塞方式發送數據。
|
估計是你的服務器端發完數據后就close了啊?
這樣的話,client端需要重新connect。你好好檢查下。
|
程序崩潰和描述字到數字到最大是沒關系的,是你的內存資源沒釋放,造成程序崩潰,描述字就相當一個名字,它的本質是一個數字,你用它去操作相應的對象,但它和對象是不一樣的,對象是實的,描述字是虛的。
|
Using?open?source?library?-?ACE,?everything?will?be?ok!
|
該回復于2010-09-02 17:40:36被版主刪除
|
該回復于2010-09-02 17:41:13被版主刪除
|
幫頂,k不灌水
總結
以上是生活随笔為你收集整理的linux下socket上限,[100分]高分求关于linux socket上限解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓手机chroot linux,在An
- 下一篇: 兰州大学C语言程序设计课程作业,兰州大学