当前位置: 技术问答>linux和unix
socket 初级问题。大家指教。
来源: 互联网 发布时间:2016-06-19
本文导语: listen的第二个参数指定排队的个数,但是listen接收到一个socket连接后就返回了,那怎么等待和返回下一个连接? | 给你贴段代码,其实很简单的。 bind (m_hSocket, (struct sockaddr*)&m_nLocalAddr, sizeo...
listen的第二个参数指定排队的个数,但是listen接收到一个socket连接后就返回了,那怎么等待和返回下一个连接?
|
给你贴段代码,其实很简单的。
bind (m_hSocket, (struct sockaddr*)&m_nLocalAddr, sizeof(m_nLocalAddr));
listen (m_hSocket, 5);
socklen_t addrLen = sizeof (struct sockaddr);
while(true)
{
m_acSocket = accept (m_hSocket, (struct sockaddr *)&m_nPeerAddr, &addrLen);
printf ("accept onen");
char buff[1400];
memset (buff, 0, 1400);
int len = 0;
len = recv( m_acSocket, buff, 1024, 0);
printf("n%sn",buff);
}
如果接收的数据多,或者是比较费时,上面红色的部分可以放到线程里执行。
bind (m_hSocket, (struct sockaddr*)&m_nLocalAddr, sizeof(m_nLocalAddr));
listen (m_hSocket, 5);
socklen_t addrLen = sizeof (struct sockaddr);
while(true)
{
m_acSocket = accept (m_hSocket, (struct sockaddr *)&m_nPeerAddr, &addrLen);
printf ("accept onen");
char buff[1400];
memset (buff, 0, 1400);
int len = 0;
len = recv( m_acSocket, buff, 1024, 0);
printf("n%sn",buff);
}
如果接收的数据多,或者是比较费时,上面红色的部分可以放到线程里执行。
|
还是用这个代码做例子,如果你要让接收端一直等着别人的消息,就是下面这样:
bind (m_hSocket, (struct sockaddr*)&m_nLocalAddr, sizeof(m_nLocalAddr));
listen (m_hSocket, 5);
socklen_t addrLen = sizeof (struct sockaddr);
while(true)
{
m_acSocket = accept (m_hSocket, (struct sockaddr *)&m_nPeerAddr, &addrLen);
printf ("accept onen");
char buff[1400];
memset (buff, 0, 1400);
int len = 0;
len = recv( m_acSocket, buff, 1024, 0);
printf("n%sn",buff);
}
不知道你说的5个socket是指什么,有5个socket给接收端发消息?还是指有5个m_acSocket?
上面代码中每次while里的m_acSocket都是不一样的,你可以打印地址看下。只是因为每个循环中需要处理的内容(红色部分)较少,因此就等第一次接收完,再accept第二个连接,接第二m_acSocket的数据,。。。。
如果是红色部分,也就是你要从这个m_acSocket收发的数据太多,比较费时,你仍然可以用上述形式,只是这样的话,第一次accept后,假如需要两分钟来收数据,那第二个连接就得等2分钟后才能accept了,效率是不是很低?因此,这种情况下最好把红色部分放到线程里。
bind (m_hSocket, (struct sockaddr*)&m_nLocalAddr, sizeof(m_nLocalAddr));
listen (m_hSocket, 5);
socklen_t addrLen = sizeof (struct sockaddr);
while(true)
{
m_acSocket = accept (m_hSocket, (struct sockaddr *)&m_nPeerAddr, &addrLen);
printf ("accept onen");
char buff[1400];
memset (buff, 0, 1400);
int len = 0;
len = recv( m_acSocket, buff, 1024, 0);
printf("n%sn",buff);
}
不知道你说的5个socket是指什么,有5个socket给接收端发消息?还是指有5个m_acSocket?
上面代码中每次while里的m_acSocket都是不一样的,你可以打印地址看下。只是因为每个循环中需要处理的内容(红色部分)较少,因此就等第一次接收完,再accept第二个连接,接第二m_acSocket的数据,。。。。
如果是红色部分,也就是你要从这个m_acSocket收发的数据太多,比较费时,你仍然可以用上述形式,只是这样的话,第一次accept后,假如需要两分钟来收数据,那第二个连接就得等2分钟后才能accept了,效率是不是很低?因此,这种情况下最好把红色部分放到线程里。