运行服务器套接字continously [英] running server socket continously

查看:270
本文介绍了运行服务器套接字continously的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用TCP socket.I书面code建立服务器和客户机之间的连接已经断开中的客户端有问题。我想服务器端运行的下一个客户端持续等待,即使当前客户端关闭。
我的code的客户端:

  INT主(INT ARGC,CHAR *的argv [])
{
INT的sockfd = 0,N = 0,C;
焦炭recvBuff [1024];
结构SOCKADDR_IN serv_addr;
如果(的argc!= 2)
{
    的printf(\\ n用法:%S<服务器&GT的知识产权; \\ N的argv [0]);
    返回1;
}memset的(recvBuff,0,sizeof的(recvBuff));
如果((的sockfd =插座(AF_INET,SOCK_STREAM,0))小于0)
{
    的printf(\\ n错误:无法创建套接字\\ n);
    返回1;
}memset的(安培; serv_addr,0,sizeof的(serv_addr));serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(6006);如果(inet_pton(AF_INET,argv的[1],&放大器; serv_addr.sin_addr)下; = 0)
{
    的printf(\\ n inet_pton出错\\ n);
    返回1;
}如果(连接(的sockfd,(结构sockaddr *)及serv_addr,sizeof的(serv_addr))小于0)
{
   的printf(\\ n错误:连接失败\\ n);
   返回1;
}
而(1)
{
的printf(\\ n 1读\\ n);
的printf(\\ N 2断开\\ n);
的printf(\\ n 3到退出\\ n);
scanf函数(%D,和C);
    开关(三)
    {
    情况1:
        的printf(\\ n的内部情况1 \\ n);
        如果((N =送(的sockfd,和C,的sizeof(C),0))0)
            的printf(\\ n上被发送\\ n);
        N =的recv(的sockfd,recvBuff,sizeof的(recvBuff)-1,0);
        recvBuff [N] = 0;
            如果(的fputs(recvBuff,标准输出)== EOF)
            {
                    的printf(\\ n错误:FPUTS错误。\\ n);
            }
        打破;
    案例2:
        接近(的sockfd); //只关闭客户端而不是服务器
    案例3:
        接近(的sockfd);
        出口(1);    }
}}

code服务器端:

  INT主(INT ARGC,CHAR *的argv [])
{
INT listenfd = 0,connfd = 0,资讯,N;
结构SOCKADDR_IN serv_addr;焦炭sendBuff [1025];
time_t的蜱;
listenfd =插座(AF_INET,SOCK_STREAM,0);
memset的(安培; serv_addr,0,sizeof的(serv_addr));
memset的(sendBuff,0,sizeof的(sendBuff));serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(6006);绑定(listenfd,(结构sockaddr *)及serv_addr,sizeof的(serv_addr));听(listenfd,10);而(1)
{
    connfd =接受(listenfd,(结构sockaddr *)NULL,NULL);
的printf(\\ n接受\\ n);
而(1)
{
    的printf(\\ n的内部,而\\ n);
    如果((N =的recv(connfd,&放大器;信息,sizeof的(信息),0))大于0)
    的printf(\\ n中的接收\\ n);
    开关(INFO)
    {
    情况1:
            蜱=时间(NULL);
            的snprintf(sendBuff,sizeof的(sendBuff),%.24s \\ r \\ n的ctime(安培;蜱));
            发送(connfd,sendBuff,strlen的(sendBuff),0);
        打破;
    }
}
关闭(connfd);
 }}

而服务器运行(服务器等待下一个客户端连接)提供给我的解决方案独自断开连接客户端。即使我使用的情况下,2返回0它没有工作。好心帮me.Thanks提前


解决方案

 否则如果(N == 0)
{
   的printf(客户端断开连接\\ n);
   关闭(connfd);
   打破;
}

在服务器程序添加上述code旁边的

  IF((N =的recv(connfd,&安培;信息,sizeof的(信息),0))0)
    的printf(\\ n中的接收\\ n);

问题是,当你的客户要断开连接,你需要发送一些API关闭客户端连接。

如果客户端已经断开upnormally则上述生产线将用于自动关闭客户端。

然后警告在制作的snprintf(sendBuff,sizeof的(sendBuff),%.24s \\ r \\ n的ctime(安培;蜱));

I have written code to establish connection between server and client using TCP socket.I have got problem in disconnecting the client side. I want server side to run continuously waiting for next client even if the current client closes. My code for client side:

int main(int argc, char *argv[])
{
int sockfd = 0, n = 0,c;
char recvBuff[1024];
struct sockaddr_in serv_addr;
if(argc != 2)
{
    printf("\n Usage: %s <ip of server> \n",argv[0]);
    return 1;
} 

memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    printf("\n Error : Could not create socket \n");
    return 1;
} 

memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(6006); 

if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
    printf("\n inet_pton error occured\n");
    return 1;
} 

if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
   printf("\n Error : Connect Failed \n");
   return 1;
} 
while(1)
{
printf("\n 1 to read \n");
printf("\n 2 to disconnect \n");        
printf("\n 3 to exit \n");
scanf("%d",&c);
    switch(c)
    {
    case 1:
        printf("\n Inside case 1 \n");
        if((n=send(sockfd,&c,sizeof(c),0))>0)
            printf("\n Sent \n");
        n = recv(sockfd, recvBuff, sizeof(recvBuff)-1,0);
        recvBuff[n] = 0;
            if(fputs(recvBuff, stdout) == EOF)
            {
                    printf("\n Error : Fputs error\n");
            }
        break;
    case 2:
        close(sockfd);//to close only client not server 
    case 3:
        close(sockfd);
        exit(1);



    }
}

}

code for server side:

int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0,info,n;
struct sockaddr_in serv_addr; 

char sendBuff[1025];
time_t ticks; 
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(6006); 

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1)
{
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
printf("\n Accepted \n");
while(1)
{
    printf("\n Inside while \n");
    if((n=recv(connfd,&info,sizeof(info),0))>0)
    printf("\n received \n");
    switch(info)
    {
    case 1:
            ticks = time(NULL);
            snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
            send(connfd, sendBuff, strlen(sendBuff),0); 
        break;
    }
}
close(connfd);


 }

} 

Provide me solution to disconnect client alone while server is running (server waits for next client connection). Even if I use return 0 in case 2 it does not works. Kindly help me.Thanks in advance

解决方案

else if(n == 0)
{
   printf("client disconnected\n");
   close(connfd);
   break;
}

Add the above code in the server program next to

if((n=recv(connfd,&info,sizeof(info),0))>0)
    printf("\n received \n");

The problem is when your client going to disconnect, you need to send some api to close the client connection.

If the client has disconnected upnormally then above lines will used to close that client automatically.

Then the warning is made in snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));.

这篇关于运行服务器套接字continously的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆