在客户端使用C语言中的UDP编程时检查服务器何时联机

在客户端使用C语言中的UDP编程时检查服务器何时联机,c,linux,udp,C,Linux,Udp,我用C语言编写了一个普通的udp客户机-服务器程序,用于将数据从客户机发送到服务器,并从服务器接收已发送消息的确认。。 所以我的问题是,如果我的服务器关闭,我的客户机向服务器发送消息。。 我的客户机如何感知服务器是启动还是关闭(nt正在工作)。 欢迎所有建议。。并且没有发现nythin与感知服务器相关。。所以请在这方面帮助我 客户端的代码在这里 #include<netinet/in.h> #include <sys/types.h> #include <

我用C语言编写了一个普通的udp客户机-服务器程序,用于将数据从客户机发送到服务器,并从服务器接收已发送消息的确认。。 所以我的问题是,如果我的服务器关闭,我的客户机向服务器发送消息。。 我的客户机如何感知服务器是启动还是关闭(nt正在工作)。 欢迎所有建议。。并且没有发现nythin与感知服务器相关。。所以请在这方面帮助我

客户端的代码在这里

 #include<netinet/in.h> 
 #include <sys/types.h> 
 #include <sys/socket.h> 
 #include<stdio.h> 
 #include <arpa/inet.h> 
 #include <string.h> 
   #include<fcntl.h> 
#include<unistd.h>
#include<stdlib.h>
#include<sqlite3.h>



 void enterdb(char *);


int main() 
  { 
int sfd,l; 
char *buf=(char*)malloc(100*sizeof(char)),buf1[10]="";//=(char *)malloc(100*sizeof(char)); 
struct sockaddr_in server,client; 
sfd=socket(AF_INET,SOCK_DGRAM,0); 
     int sender_len=sizeof(server);
struct msghdr msg;
 struct iovec iov;


  bzero(&server,sizeof(server)); 
  server.sin_family=AF_INET; 
  server.sin_port=htons(1300); 
  server.sin_addr.s_addr=inet_addr("127.0.0.1");

   msg.msg_name = &server;
   msg.msg_namelen = sender_len;
msg.msg_iov = &iov;
msg.msg_iovlen = sizeof(buf1);
msg.msg_iov->iov_base = buf1;
msg.msg_iov->iov_len = 9;
msg.msg_control = 0;
msg.msg_controllen = 0;
 msg.msg_flags = 0;

    printf("Enter the message:"); 
    gets(buf); 
    char *test="quit";
    if(strcmp(test,buf)==0)
        {
        printf("now exiting\n");
        close(sfd);
        exit(0);
        return 0;
        }            
    else 
        {
        int s;
        s=sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&server,sizeof(server));

        printf("control passed on here and message sent is of %d bytes \n",s);  

        printf("control passed on here again and message sent is of %d bytes\n ",s);    
        //sleep(5);
        int length = sizeof(server);


        printf("%s\n",buf1);

        int x = recvmsg(sfd,&msg,MSG_DONTWAIT);
        if(x<0)
        {
        printf("error");
        }
        /*while( ( x =recvfrom(sfd,buf1,100,0,(struct sockaddr*)&server,&length)))
        { 
        if(x<0)
        return 1;   
        break;
        }*/


        else {
        printf("%s\n",buf1);
        char *recv="recieved";
        if(strcmp(recv,buf1) != 0 )
            {
            printf("**** control is in connect ***\n");  
            enterdb(buf);
            }
        else 
            {
            memset(buf,0,strlen(buf)); 
            printf("MESSAGE FOR SERVER : you sent me the message has been- %s\n",buf1);
                } 
        }
    }



close(sfd);
return 0;
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效输入DB(字符*);
int main()
{ 
国际科学基金会,l;
char*buf=(char*)malloc(100*sizeof(char)),buf1[10]=“”;//=(char*)malloc(100*sizeof(char));
服务器、客户端中的结构sockaddr_;
sfd=插座(AF INET,SOCK DGRAM,0);
int sender_len=sizeof(服务器);
结构msghdr msg;
结构iovec iov;
bzero(&server,sizeof(server));
server.sinu family=AF\u INET;
server.sin_port=htons(1300);
server.sin_addr.s_addr=inet_addr(“127.0.0.1”);
msg.msg_name=&server;
msg.msg\u namelen=发送方\u len;
msg.msg_iov=&iov;
msg.msg_iovlen=sizeof(buf1);
msg.msg_iov->iov_base=buf1;
msg.msg_iov->iov_len=9;
msg.msg_control=0;
msg.msg_controllen=0;
msg.msg_标志=0;
printf(“输入消息:”);
获取(buf);
char*test=“退出”;
如果(strcmp(测试,buf)==0)
{
printf(“正在退出\n”);
关闭(sfd);
出口(0);
返回0;
}            
其他的
{
int-s;
s=sendto(sfd、buf、strlen(buf)、0、(struct sockaddr*)和server、sizeof(server));
printf(“在此传递的控件和发送的消息的字节数为%d\n”,s”);
printf(“再次在此传递控制,发送的消息为%d字节\n”,s”);
//睡眠(5);
int length=sizeof(服务器);
printf(“%s\n”,buf1);
int x=recvmsg(sfd和msg,msg_DONTWAIT);

如果(x检测服务器是否停机的常用方法是向其发送消息并等待有限的时间(可能是30秒,可能是15分钟,取决于应用程序和网络…)。在您的情况下,您必须在客户端中设置超时,在发送消息时开始超时,在收到确认时停止。如果超时在“唤醒”之前未停止,则会触发异常或设置特定变量(这些是通知应用程序超时已过而服务器没有应答的常用方法)。

@imsteffan thakyou寻求帮助。在我关闭服务器15分钟并重新启动后,我如何再次检测服务器我何时启动?不客气:-)要检测您的服务器是否已启动,您的客户端应继续发送消息;一旦计算机启动,您就启动UDP服务器,它会回答客户端,然后客户端知道服务器已启动。哦,顺便说一下,当我尝试获取Receive msg.时,我的伪代码是lmsteffan.buddy。当服务器关闭时。该进程将停止,并且不会抛出错误消息错误it@imsteffan很抱歉,无法正确标记您。我正在上载客户端代码,我使用了recvfrom,也尝试了recvmsg。请帮助我了解其中是否也有peoplerecvfrom代码。请告诉我将进行哪些修改,以防我的服务器没有写入recvfrom并引发错误。