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

请教:SOCKET编程的问题.

    来源: 互联网  发布时间:2015-08-05

    本文导语:  各位高手: 兄弟最近刚开始学习在Linux下GCC编程。我想做一个程序,实现如下功能。 在服务器上侦听工作站发送来的心跳包。如果心跳包接收不到,服务器在 2分钟后关闭。使用TCP连接,使用Select监视套接字是否收到...

各位高手:
兄弟最近刚开始学习在Linux下GCC编程。我想做一个程序,实现如下功能。
在服务器上侦听工作站发送来的心跳包。如果心跳包接收不到,服务器在
2分钟后关闭。使用TCP连接,使用Select监视套接字是否收到数据。
可是,好象不管套接字是否收到数据Select都会在设定的超时时间返回超
时信息。很困惑啊。想实现前述功能应该如何修改我的代码?

我的代码如下:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MYPORT 3490 /*用户所连接的端口号*/
#define BACKLOG 1 /*最大连接数*/

main()
{
int sockfd,new_fd; /*在sockfd上监听,在new_fd上建立新的连接*/
struct sockaddr_in my_addr; /*本机地址信息*/
struct sockaddr_in their_addr; /*客户端计算机地址信息*/
int sin_size;
int numbytes; /*接收到的字节数*/
char buf[4]; /*一次最多接收4个字节*/

fd_set readfds;
fd_set readfds_new;
struct timeval tv; /*超时时间*/
struct timeval tv_new;
tv.tv_sec=20;
tv.tv_usec=0;
tv_new.tv_sec=120;
tv_new.tv_usec=0;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

my_addr.sin_family=AF_INET; /*host byte order*/
my_addr.sin_port=htons(MYPORT); /*short,network byte order*/
my_addr.sin_addr.s_addr=INADDR_ANY; /*auto-fill with my IP*/
bzero(&(my_addr.sin_zero),8); 

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}

if(listen(sockfd,BACKLOG) == -1)
{
perror("listen");
exit(1);
}

FD_ZERO(&readfds); /*清空输入文件描述符集*/
FD_SET(sockfd,&readfds);
select(sockfd+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(sockfd,&readfds))
{
printf("to be accept connect.n");
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size)) == -1)
{
perror("accept");

}
printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr));

while(1)
{
FD_ZERO(&readfds_new); /*清空输入文件描述符集*/
FD_SET(new_fd,&readfds_new);
select(new_fd+1,&readfds_new,NULL,NULL,&tv_new);
if(FD_ISSET(new_fd,&readfds_new))
{
if((numbytes=recv(new_fd,buf,3,0)) == -1)
{
perror("recv");
continue;
}
printf("Connected.%dn",numbytes);
}
else /*如果120秒内没有收到工作站发来的心跳包,关机*/
{
printf("shoutdown this computer now.n");
system("shutdown -h now");/*关机*/
exit(0);
}
}
}
else /*如果20秒内工作站没有连接,提示检查网络连接*/
{
printf("Check your newwork.n");
exit(-1);
}
}

|
每次在执行下面这句代码之前,需要重设一下tv_new的值,这点至关重要
select(new_fd+1,&readfds_new,NULL,NULL,&tv_new);

    
 
 

您可能感兴趣的文章:

  • 请教终端编程&curses编程高手
  • 请教一个shell编程的问题,就是如何在shell编程中读一个文件的内容?谢谢啦!
  • 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
  • 请教:我想在unix编程领域发展,我应该在哪些方面努力?
  • 请教Linux下的编程工具
  • 新手请教,linux网络编程。
  • 请教一个多进程编程问题
  • 请教高手:如何学习内核编程?
  • 请教gcc编程 问题 关于调用中断 实现 图形模式
  • 请教linux下c编程的一个问题!
  • 急!!请教关于linux socket编程的一个问题!!
  • 请教LINUX下的网络编程?
  • 请教:想学LINUX内核编程,请指点
  • 请教:Linux下的C++编程和Windows下有什么不同,要注意什么?
  • 请教一下哪里有UNIX下C编程标准下载?
  • 请教串口通信的编程
  • 请教一下:Linux下如何编程制作系统托盘
  • arm串口缓冲和c编程请教
  • 菜鸟请教linux下的网络编程
  • 请教如何学习Linux上的编程
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 请教: linux下用c++写最简单的socket程序如何写?
  • socket双向通讯模式请教
  • 请教linux下管理多个socket用什么,难道只能用select?
  • 请教有关socket的问题,并求telnetd的c源码
  • 请教:socket编程中send和write的区别
  • 关于socket通信,C的代码,有个问题请教高手!
  • 请教各位一个socket问题
  • linux socket的使用问题,请教
  • 请教关于socket通讯中客户端接收服务端信息的问题
  • 使用tomcat出现的问题(socket write error),请教大家
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


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

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

    浙ICP备11055608号-3