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不灌水

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值