server.cpp
上传用户:longrun888
上传日期:2022-06-19
资源大小:1k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

C/C++

  1. #include <iostream>
  2. #include <fstream>
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. #include <strings.h>
  12. using namespace std;
  13. #define MAXLINE 4096
  14. #define LISTENQ 6
  15. #define SERV_PORT 9700
  16. static int line_read(int fd, char *ptr)
  17. {
  18. static int read_cnt = 0;
  19. static char *read_ptr;
  20. static char read_buf[MAXLINE];
  21. if (read_cnt <= 0) {
  22. again:
  23. if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
  24. if (errno == EINTR)
  25. goto again;
  26. return(-1);
  27. } else if (read_cnt == 0)
  28. return(0);
  29. read_ptr = read_buf;
  30. }
  31. read_cnt--;
  32. *ptr = *read_ptr++;
  33. return(1);
  34. }
  35. int readline(int fd, void *vptr, size_t maxlen)
  36. {
  37. int n, rc;
  38. char c, *ptr;
  39. ptr = (char *)vptr;
  40. for (n = 1; n < maxlen; n++) {
  41. if ( (rc = line_read(fd, &c)) == 1) {
  42. *ptr++ = c;
  43. if (c == 'n')
  44. break; /* newline is stored, like fgets() */
  45. } else if (rc == 0) {
  46. if (n == 1)
  47. return(0); /* EOF, no data read */
  48. else
  49. break; /* EOF, some data was read */
  50. } else
  51. return(-1); /* error, errno set by read() */
  52. }
  53. *ptr = 0; /* null terminate like fgets() */
  54. return(n);
  55. }
  56. int Readline(int fd, void *ptr, size_t maxlen)
  57. {
  58. ssize_t n;
  59. if ( (n = readline(fd, ptr, maxlen)) < 0){}
  60. // err_sys("readline error");
  61. return(n);
  62. }
  63. ssize_t /* Write "n" bytes to a descriptor. */
  64. writen(int fd, const void *vptr, size_t n)
  65. {
  66. size_t nleft;
  67. ssize_t nwritten;
  68. const char *ptr;
  69. ptr = (const char *)vptr;
  70. nleft = n;
  71. while (nleft > 0) {
  72. if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
  73. if (errno == EINTR)
  74. nwritten = 0; /* and call write() again */
  75. else
  76. return(-1); /* error */
  77. }
  78. nleft -= nwritten;
  79. ptr   += nwritten;
  80. }
  81. return(n);
  82. }
  83. /* end writen */
  84. void Writen(int fd, void *ptr, size_t nbytes){
  85. if (writen(fd, ptr, nbytes) != nbytes)
  86. cout << "writen error";
  87. }
  88. void outecho(int sockfd)
  89. {
  90. ssize_t p;
  91. char line[MAXLINE];
  92. char newline[2];
  93. if ( (p = Readline(sockfd, line, MAXLINE)) == 0)
  94. return; /* connection closed by other end */
  95. line[strlen(line)-1]='';
  96. cout << "Reiceving Input: '" << line << "' from Client";
  97. sprintf(line,"%s > temp.tmp",line);
  98. system(line);
  99. char fout[MAXLINE];
  100. ifstream file;
  101. file.open("temp.tmp");
  102. char ch;
  103. while(file.eof() == false){
  104. ch = file.get();
  105. if(ch == 'n')
  106. ch = 136;
  107. Writen(sockfd, &ch, 1);
  108. }
  109. cout << "nOutput Sent to Client---------n";
  110.         file.clear();
  111.         file.close();
  112. close(sockfd);
  113. }
  114. int main(int argc, char **argv)
  115. {
  116. int listenfd, connfd;
  117. pid_t childpid;
  118. socklen_t clilen;
  119. struct sockaddr_in cliaddr, servaddr;
  120. listenfd = socket(AF_INET, SOCK_STREAM, 0);
  121. bzero(&servaddr, sizeof(servaddr));
  122. servaddr.sin_family      = AF_INET;
  123. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  124. servaddr.sin_port        = htons(SERV_PORT);
  125. bind(listenfd, (const  struct  sockaddr   *) &servaddr, sizeof(servaddr));
  126. listen(listenfd, LISTENQ);
  127. for ( ; ; ) {
  128. clilen = sizeof(cliaddr);
  129. connfd = accept(listenfd, (struct  sockaddr   *) &cliaddr, &clilen);
  130. if ( (childpid = fork()) == 0) { /* child process */
  131. close(listenfd); /* close listening socket */
  132. outecho(connfd); /* process the request */
  133. exit(0);
  134. }
  135. close(connfd); /* parent closes connected socket */
  136. }
  137. }