1

我想编写程序,以便在客户端断开连接时,服务器将准备好接受来自客户端的新请求。这是代码

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

#define MAXLINE 100
#define LISTENQ 10

int main()
{
    int tmp, listenfd, connfd;
    int sin_size;
    struct sockaddr_in servaddr, cliaddr;
    char  buff[MAXLINE];
    time_t ticks;
    while(true)
    {
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = INADDR_ANY;
        servaddr.sin_port        = htons(13);
        memset(&(servaddr.sin_zero),'\0',8);
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if(listenfd == -1){
           perror("error socket");
           exit(1);
          }

        tmp=bind(listenfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr));
        if(tmp == -1){
            perror("error bind..");
            exit(1);
        }

        tmp=listen(listenfd, LISTENQ);
        if(tmp == -1){
            perror("error listen"); 
            exit(1);
        }

        sin_size = sizeof(struct sockaddr_in);    
        connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &sin_size);
        if(connfd == -1){
            perror("error accept"); 
            exit(1);
        }

        ticks = time(NULL);
        snprintf(buff,sizeof(buff),"Now Time: %.24s\r\n", ctime(&ticks));
        write(connfd, buff, strlen(buff));
        close(connfd);
        close(listenfd);
    }
}

我发现这部分有问题

tmp=bind(listenfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr));

错误:从 'int*' 到 'socklen_t* {aka unsigned int*}' 的无效转换 [-fpermissive]

connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &sin_size);

错误:初始化 'int accept(int, sockaddr*, socklen_t*)' [-fpermissive] 的参数 3

这些问题我该怎么办?指针不对吗?

4

4 回答 4

1

更改您的声明

 socklen_t  sin_size;  

这解决了你的问题。


您也可以尝试将此作为最后的手段,但上述更改对您来说效果很好。

修改此语句

connfd=accept(listenfd,(struct sockaddr *)&cliaddr,(socklen_t *) &sin_size);

man accept

看到@alk 评论后,我从评论中添加了这一部分。

尤其是在转换指针时,它可能只是丢弃了编译时错误,但在运行时很可能会崩溃,因为取消引用指针时程序所期望的大小与现实不同。

于 2013-10-09T14:49:36.020 回答
1

你需要使用

socklen_t sin_size;
于 2013-10-09T14:41:27.523 回答
0

正确答案,需要在root-access用户上运行

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>

#define MAXLINE 100
#define LISTENQ 10

int main()
{
    int tmp, listenfd, connfd;
    socklen_t sin_size;
    struct sockaddr_in servaddr, cliaddr;
    char  buff[MAXLINE];
    time_t ticks;
    while(true)
    {
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = INADDR_ANY;
        servaddr.sin_port        = htons(13);
        memset(&(servaddr.sin_zero),'\0',8);
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if(listenfd == -1){
           perror("error socket");
           exit(1);
          }

        tmp=bind(listenfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr));
        if(tmp == -1){
            perror("error bind..");
            exit(1);
        }

        tmp=listen(listenfd, LISTENQ);
        if(tmp == -1){
            perror("error listen"); 
            exit(1);
        }

        sin_size = sizeof(struct sockaddr_in);    
        connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &sin_size);
        if(connfd == -1){
            perror("error accept"); 
            exit(1);
        }

        ticks = time(NULL);
        snprintf(buff,sizeof(buff),"Sekarang pukul: %.24s\r\n", ctime(&ticks));
        write(connfd, buff, strlen(buff));
        close(connfd);
        close(listenfd);
    }
}
于 2013-10-09T15:10:52.083 回答
0

使用while(1)代替while(true)和使用 C 编译器而不是 C++ 编译器。

错误来自使用 C++ 编译器编译源代码。如果您使用 C 编译器,您的代码不会产生上述错误,除非现在true没有定义。

于 2013-10-09T14:33:59.753 回答