当前位置: 技术问答>linux和unix
[100分]高分求关于linux socket上限解决方案
来源: 互联网 发布时间:2016-09-25
本文导语: 我想写一个复用socket的程序,以避免linux里socket最高上限的限制。因为程序是运行在服务器端,只提高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;
}
/*======================*/
我遇到的问题是:第一次能够成功连接,并下载数据;但是再次连接就无法连接上。
下面的这个函数是要无限循环运行的。
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、不能连接的话,报的错误是什么?
2、不能连接的话,报的错误是什么?
|
是不是你的服务器端发完数据后就close了啊?
这样的话,client端需要重新connect。
这样的话,client端需要重新connect。
|
楼主,是刚接触Linux吧。linux里的描述字是不管你是不是释放相应的资源,都会往上涨,到了最大值后又从最小值开始的。包括文件描述字也一样。所以你可以创建一个长连接,每次用非阻塞方式发送数据。
|
估计是你的服务器端发完数据后就close了啊?
这样的话,client端需要重新connect。你好好检查下。
这样的话,client端需要重新connect。你好好检查下。
|
程序崩溃和描述字到数字到最大是没关系的,是你的内存资源没释放,造成程序崩溃,描述字就相当一个名字,它的本质是一个数字,你用它去操作相应的对象,但它和对象是不一样的,对象是实的,描述字是虚的。
|
Using open source library - ACE, everything will be ok!
|
|
|
帮顶,k不灌水