每次创建socket用完的时候都要关闭。
如下用for循环创建了100个socket:
如果不关闭的话,每次创建的sockfd都不一样;
如果关闭的话,每次创建的时候可能用的还是上一次sockfd。
所以,如果创建太多不关闭的话将会耗尽资源,导致创建失败。
linux当中每个进程分配的文件句柄数量是有限的(一般是1024)。
socket在Linux下也是被当作一个文件的。
sockfd:socket生成的sockfd对应文件句柄(针对进程的内部标识)。
linux下有3个默认的已经被进程使用了sockfd:
0表示标准输入,1表示表示标准输出,2表示错误输出
linux下如何查看文件句柄最大数:ulimit -n(默认的一般是1024)
linux下如何修改文件句柄最大数:ulimit -n 3000(修改最大文件句柄为3000)
函数说明:
int socket(int domain,int type,int protocol)
功能:
返回描述符
参数说明:
domain:也叫协议族(family),指定协议
AF_INEF----TCP/IP协议
...
type:指定socket类型
SOCK_STREAM----TCP
SOCK_DGRAM----UDP
...
protocol:公共协议
0----自动选择type类型对应的默认协议
返回值:
>=0------创建socket成功
如:
int sockfd = socket(AF_INEF,SOCK_STREAM,0);
Windows下的socket编程(需要多操作两步)
1. 初始化动态链接库
2.引用lib库
//第一步:创建socket
#include<windows.h>
#include<winsock2.h>
#pragma comment(lib,"WS2_32.lib")
#include<stdio.h>
int main(int argc,char *argv[])
{
//初始化动态链接库
//加载winsock DLL
WSADATA ws;
if (WSAStartup(MAKEWORD(2,2),&ws)!= 0)
{
printf ("winsock 初始化失败!n");
return 1;
}
int i;
for (i=0;i<100;i++)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0); //创建socket
if (sockfd == -1)
{
printf ("create socket failed!n");
return -1;
}
printf("[%d]",sockfd);
closesocket(sockfd);
}
getchar();
return 0;
}
说明:
使用工具:windows下的codeblocks
如果运行上面程序报错:undefined reference to `WSAStartup@8'|
原因:缺少socket的链接参数
解决方案:
menu-->Project-->build options-->Debug-->Linker Settings-->Other Linker Options:
加上 “-lws2_32“
Linux下的socket编程
//第一步:创建socket
#include <sys/types.h> //socket的头文件
#include <sys/socket.h> //socket的头文件
#include <unistd.h> //close的头文件
#include<stdio.h>
int main(int argc,char *argv[])
{
int i;
for (i=0;i<100;i++)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0); //创建socket
if (sockfd == -1)
{
printf ("create socket failed!n");
return -1;
}
printf("[%d]",sockfd);
close(sockfd);
}
getchar();
return 0;
}
说明:
Linux下编程的头文件和windows的有差异,需要特别注意。
closesocket——close