当前位置:  技术问答>linux和unix

socket编程使用select的问题?

    来源: 互联网  发布时间:2016-01-18

    本文导语:  一个简单的程序: Server端使用select监听多个Client,Client发数据给Server,Server把受到的数据打印出来。 出现的问题是:当只有一个Client连接时,无法收到Client端发来的数据,多个Client连接时则正常。 我是使用telnet做Clien...

一个简单的程序:
Server端使用select监听多个Client,Client发数据给Server,Server把受到的数据打印出来。
出现的问题是:当只有一个Client连接时,无法收到Client端发来的数据,多个Client连接时则正常。
我是使用telnet做Client来测试的。
代码如下,各位老大帮看一下:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUF_SIZ 1024
int port = 2007;

int main()
{
/* local varibles */
int srv_skt_fd;
int clt_skt_fd;
fd_set set,read_set;
int max_fd;
int i;

char buf[BUF_SIZ];
int len;

struct sockaddr_in serv_addr;
struct sockaddr_in clt_addr;

/* program begin from here */
/* Step1: open a socket */
if ((srv_skt_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)/* TCP socket */
{
perror("socket open");
exit(1);
}

/* Step2: bind it to host address */
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(port);
if (bind(srv_skt_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
{
perror("bind");
close(srv_skt_fd);
exit(1);
}

/* Step3: listen */
if (listen(srv_skt_fd,SOMAXCONN) == -1)
{
perror("listen");
close(srv_skt_fd);
exit(1);
}

/* Step4: build a fd_set for select */
FD_ZERO(&set);

/* Step5: add server socket fd to this fd_set */
FD_SET(srv_skt_fd,&set);
max_fd = srv_skt_fd + 1;

/* Step6: write a infinite loop that call select and handle all requests */
while (1)
{
printf("startn");
read_set = set;
/* wait for a request here */
if (select(max_fd,&read_set,NULL,NULL,NULL) == -1)
{
perror("select");
close(srv_skt_fd);
exit(1);
}
printf("after selectn");
/* cleck which one is coming */
for (i = 0;i  max_fd)
{
max_fd = clt_skt_fd + 1;
}
}else /* case 2 */
{
/* add your code here */
if ((len = recv(i,buf,BUF_SIZ,0)) == -1)
{
perror("recv");
close(srv_skt_fd);
exit(1);
}
if (len == 0)
{
FD_CLR(i,&set);
if ((i+1) == max_fd)
{
max_fd--;
}
close(i);
}else {
buf[len] = '';
printf("got msg from %d: %sn",i,buf);
}
}
}
}

}

/* Step8: clean up */
return 0;
}

|
srv_skt_fd这个,select监听我觉得应该是返回的clientsock和srv_skt_fd之间最大值加1;而不是本身监听端口加1;

    
 
 

您可能感兴趣的文章:

  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 关于文件操作和Socket网络编程!
  • linux下socket编程问题!
  • socket编程 中的bind问题
  • socket编程--htons
  • 急!!请教关于linux socket编程的一个问题!!
  • 急!关于SOCKET编程,在线等待!
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • 多进程socket编程问题
  • 问一个socket编程问题,急~~~
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 请教一个socket编程问题
  • 求助!!linux下socket编程
  • socket编程,使用recvfrom()函数监听问题。
  • sco unix下socket编程的问题,请大家帮忙
  • php使用socket_bind()函数绑定IP地址
  • 怎样解决"Cannot set Socket Options for Trasnmit Socket" error 当使用setsockopt() 在solaris 5.8
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 如何使用另外进程的socket
  • linux无线网络传输也可以直接使用socket接口编程吗?
  • Linux下的Socket通信如何断开连接的端口从而实现重复使用该端口
  • linux下面如何查询某个进程正在使用的socket句柄数量
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 怎样使用socket方式取得web服务器上的页面
  • linux 下使用socket, link时候一堆undefined reference
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • socket select异常?
  • select和非阻塞socket的迷惑
  • socket编程select对accept的影响
  • 请教linux下管理多个socket用什么,难道只能用select?
  • socket select()能否取得剩余时间
  • socket编程中的select问题
  • socket中的select模型问题
  • linux下用C写socket程序编程中的select里面的timeout的值的单位到底是什么?
  • 我做了个socket服务器,但是客户端接收数据的时候用select()函数????可接受不到
  • socket的select使用超时的问题
  • 【请教】Linux下用select()监测socket,是不是通常不去监测可写状态的?
  • 哪位高手给个unix系统下C语言socket+fork()+select()的例子?
  • 一个未连接的客户端socket套接字在select处的奇怪行为
  • 求助,关于linux下socket的select模式编程
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现 iis7站长之家
  • 程序用socket和select导致ubuntu脱网
  • 服务器端关闭,客户端select 会一直可读, 读的长度是-1,怎么在不关闭客户端socket下,清除可读
  • socket中select函数求救
  • socket通信时,select一直返回超时的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3