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

evoloyeu 2010-09-01 01:22:11
加精
我想写一个复用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:%s\n", IPString);

pthread_mutex_lock(&mutex);
if ((ip = get_IPURLLINKAGE_IP(pIPURLLink, IPString)) == NULL) {
printf("m3u8Parser->pthread_mutex_lock:%s\n", ip);
if ((ip = GetIP(IPString)) == NULL) {
printf("m3u8Parser->GetIP->EXIT_FAILURE\n");
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 createSaveDirectory\n");
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("%s\n", 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:%d\n", m3u8sSocket);
}
printf("m3u8Parser sSocket:%d\n", 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:%d\n", nRet);
//----------------------------------------------
// while(1){
//处理接收到的数据。
}
//----------------------------------------------
shutdown(m3u8sSocket, SHUT_WR);
// close(m3u8sSocket);
fclose(fp);

return TRUE;

GOEND:
// printf("GOEND\n");
#ifdef WIN32
WSACleanup();
#endif
fclose(fp);

return FALSE;
}
/*======================*/
...全文
2217 115 打赏 收藏 转发到动态 举报
写回复
用AI写文章
115 条回复
切换为时间正序
请发表友善的回复…
发表回复
davelv 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 110 楼 interfan 的回复:]

epoll
[/Quote]
evoloyeu 2010-09-07
  • 打赏
  • 举报
回复
多谢各位捧场呵呵呵
deviosyan 2010-09-07
  • 打赏
  • 举报
回复
学习 看看
guoguo943 2010-09-06
  • 打赏
  • 举报
回复
东西做的不错
这个帖子我推荐一下东西做的不错
这个帖子我推荐一下东西做的不错
这个帖子我推荐一下东西做的不错
这个帖子我推荐一下东西做的不错
这个帖子我推荐一下
yanxueyan 2010-09-06
  • 打赏
  • 举报
回复
学习了,呵呵
shwarpine 2010-09-06
  • 打赏
  • 举报
回复
Mark.谢谢楼主的问题。
__不二 2010-09-06
  • 打赏
  • 举报
回复
epoll
qiang1533 2010-09-05
  • 打赏
  • 举报
回复
学习学习
wds530405973 2010-09-05
  • 打赏
  • 举报
回复
呵呵好学习
zmkkobe 2010-09-05
  • 打赏
  • 举报
回复
不太清楚的
macro_lu 2010-09-04
  • 打赏
  • 举报
回复
学习学习下,这个太复杂了
john2388888 2010-09-04
  • 打赏
  • 举报
回复
socket编程不难吧
qq4632540 2010-09-04
  • 打赏
  • 举报
回复
高手就是不一样啊
lqb2002 2010-09-04
  • 打赏
  • 举报
回复
读了这篇帖子,我觉得集思广益太重要了啊!,我会经常来这里的。
superastar 2010-09-03
  • 打赏
  • 举报
回复
看看代码再说。
xuqiancheng 2010-09-03
  • 打赏
  • 举报
回复
mark,,,, fighting!
s1w2l31112 2010-09-03
  • 打赏
  • 举报
回复
观望学习中
grace6273 2010-09-03
  • 打赏
  • 举报
回复
学习学习 学习了
macklau 2010-09-03
  • 打赏
  • 举报
回复
学习了
OwenYang_cn 2010-09-03
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
加载更多回复(85)

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧