2014-01-30 84 views
0

我有一个简单的基于tcp的客户端和c服务器编写的服务器,但是一旦我建立连接后服务器发送消息回到客户端,连接停止工作。你能帮我解决这个问题 - 我希望服务器继续接收/发送消息给客户端。C中的客户端和服务器如何保持通信

代码:

Server.c

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

#define port 5000 
#define buf  512 

void answer(int); 

int main(int argc, char *argv[]){ 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 
    int portid; 
    int backlog = 10; 
    struct sockaddr_in addr; 
    char BUFF[buf]; 
    int n; 
    int received = 0; 
    int connfd; 

    if(sock == -1){ 
     perror("socket error"); 
     exit(errno); 
    } 

    memset(&addr,0, sizeof(addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    addr.sin_addr.s_addr = INADDR_ANY; 

    if(bind(sock, (struct sockaddr*) &addr, sizeof(addr)) == -1){ 
      perror("bind error"); 
      exit(errno); 
    } 

    if(listen(sock, backlog) == -1){ 
      perror("listen error"); 
      exit(errno); 
    } 

    listen(sock, 5); 
    struct sockaddr_in cliaddr; 
    //struct sockaddr_in addr; 
    int cliaddr_len = sizeof(cliaddr); 

    while(1){ 

     connfd = accept(sock, (struct sockaddr*)&cliaddr,&cliaddr_len); 
     if(connfd == -1){ 
      perror("error connfd"); 
      exit(errno); 
     } 
     portid = fork(); 
     if(portid<0) 
      perror("error on fork"); 
     if(portid ==0){ 
      close(sock); 
      answer(connfd); 
      exit(0); 
     } 


     //close(sock); 
    } 

    close(connfd); 
    return 0; 

    //close(sock); 
    //return 0; 
} 

void answer(int connfd){ 
    int n; 
    char BUFF[buf]; 
    memset(BUFF,buf,buf); 
    n = read(connfd,BUFF,buf); 
    printf("connected: %s",BUFF); 
    //received = 1; 
    //memset(BUFF,0,buf); 
    printf("please enter your message: "); 
    memset(BUFF,0,buf); 
    fgets(BUFF,buf, stdin); 
    n = write(connfd, BUFF,strlen(BUFF)); 
    if(n<0) err("writing to socket problem"); 
} 

回答

1

您的服务器调用fork,然后if(portid ==0){...get and send message...},然后将其返回到它试图accept()循环的顶部--- 孩子的工作,但孩子正在努力做到这一点。

重构你的代码来做你想做的事。将其分解成更小的部分,这些部分对于您来说很简单,因此您可以看到类似的东西。

+0

改变它,但我仍然没有进展我错了 –

+0

你移动代码,但你没有改变它。你描述了一旦建立连接,你希望服务器_loop_,但是你没有写一个循环来做到这一点。从你的重构中,在'answer()'函数中放置一个循环将是合适的。 – mah

+0

是的,我的问题是我没有循环发送/接收代码 –

0

这是因为您的recv()数据只是一次。使用一个循环来接收,直到客户端断开连接。

while ((n = read(connfd,BUFF,buf)) 
    { 
     printf("connected: %s",BUFF); 
     //received = 1; 
     //memset(BUFF,0,buf); 
     printf("please enter your message: "); 
     memset(BUFF,0,buf); 
     fgets(BUFF,buf, stdin); 
     n = write(connfd, BUFF,strlen(BUFF)); 
     if(n<0) err("writing to socket problem"); 
    } 
0

您正在阅读你的孩子的资料,所以一旦孩子完成退出程序,所以尝试在父阅读并沿送孩子中的数据。

+0

父母每个连接只发送一次数据,所以孩子做什么并不重要。这就是说,孩子有一个循环,它读取和写入,直到任何'err()'调用导致它退出。帖子编辑删除了客户端代码,但您可以通过http://stackoverflow.com/posts/21456178/revisions查看它以查看此信息。 – mah