日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下socket上限,[100分]高分求关于linux socket上限解决方案

發布時間:2025/3/19 linux 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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上限解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。