2013-10-09 36 views
1

我想编程,以便在客户端断开连接时,服务器将准备好接受来自客户端的新请求。下面是Linux上的C网络服务器编程

#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)); 

错误的代码:从 '诠释*' 到 'socklen_t的* {又名无符号整型*}'[-fpermissive]

无效的转换
connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &sin_size); 

错误:初始化的参数3 'INT接受(INT,sockaddr的*中,socklen_t *)'[-fpermissive]

什我应该怎么处理这些问题?指针不对吗?

+0

这是一个非常易于理解的错误信息运行。 – Geoffroy

+4

将'sin_size'声明为'socklen_t'。另外,请记住'#include ' – user4815162342

+0

@ user4815162342你的意思是将sin_size声明为socklen_t像这样“int sin_size socklen_t”? – greenthunder

回答

0

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

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

+0

感谢您记住我..但它仍然有错误表示“$ demo 错误绑定..:权限被拒绝”我应该怎么做?我已经改变(true)while while(1)并保留其他 – greenthunder

+1

@greenthunder:您需要拥有root权限才能绑定到1024以下的端口。 – alk

+0

您的答案不会引起OP的问题。它显示的是一个评论。 – alk

1

您需要使用

socklen_t sin_size; 
+0

我改变了这一点,并且结果仍然是来自这里的错误绑定“tmp = bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr))” – greenthunder

+0

Just使用你刚刚修复的'sin_size'是适当的类型。 – Jite

1

Chnage你的宣言

socklen_t sin_size; 

解决您的问题。


你也可以试试这个作为最后的手段,但上面的改变会适合你。

修改此声明

connfd =接受(listenfd,(结构sockaddr *)& cliaddr,(socklen_t的*)& sin_size);

man accept

看到@alk评论我加入这部分从注释之后。

特别是在投射指针时,它可能只是抛出一个编译时错误,但很可能会在运行时崩溃,因为解引用指针与实际不同时程序期望的大小。

+1

如果最直接的解决方案是声明'sin_size'为'socklen_t',为什么你建议投射?铸件应始终作为最后的手段使用。 – alk

+0

的确,这应该是最后的手段。我添加了这个答案作为可选。 – Gangadhar

+1

特别是在投射指针时,它可能只是抛出编译时错误,但在运行时可能会崩溃,因为当引用指针与实际不同时程序期望的大小。你最好删除这部分答案。 – alk

0

正确的答案,需要在根访问用户

#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); 
    } 
} 
+0

谢谢大家,感谢alk,user4815162342,A Lan – greenthunder