客户服务器实现

时间:2014-03-10 06:59:45

标签: c

经过一番研究后,我发现这个代码适用于服务器端。

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

int main(void)
{
  int listenfd = 0,connfd = 0;

  struct sockaddr_in serv_addr;

  char sendBuff[1025];  
  int numrv;  

  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  printf("socket retrieve success\n");

  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(5000);    

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

  if(listen(listenfd, 10) == -1){
      printf("Failed to listen\n");
      return -1;
  }


  while(1)
    {

      connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); // accept awaiting request

      strcpy(sendBuff, "Message from server");
      write(connfd, sendBuff, strlen(sendBuff));

      close(connfd);    
      sleep(1);
    }


  return 0;
}

事情来自服务器,我想将一些文件发送到客户端,可能是256字节的块。

令我困惑的是,在上面的代码中,您可以看到accept调用是在循环内部进行的。 这是唯一的方法吗?如果它应该在循环中,我在哪里放置连续读取我的文件的逻辑,并发送块? 似乎我需要在while循环中嵌入另一个循环 - 在accept调用之后?

1 个答案:

答案 0 :(得分:0)

  

似乎我需要在循环中嵌入另一个循环 - 只是   接受电话后?

是的 - 您需要继续调用write()直到所有字节都被发送完毕。请记住,write()可以写出比你要求的更少的字节,因此你需要跟踪write()的返回值,以便知道传递给下一个write()调用的参数。

示例代码忽略了write()调用的返回值,当你只编写少量字节时,你可以放弃它,但这不是你想做的事情。真实的代码。