client.cpp
上传用户:deqinfy
上传日期:2022-06-19
资源大小:2k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

C/C++

  1. #include <iostream>
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <strings.h>
  11. using namespace std;
  12. #define MAXLINE 4096
  13. #define SERV_PORT 9700
  14. int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr){
  15. int n;
  16. again:
  17. if ( (n = accept(fd, sa, salenptr)) < 0) {
  18. #ifdef EPROTO
  19. if (errno == EPROTO || errno == ECONNABORTED)
  20. #else
  21. if (errno == ECONNABORTED)
  22. #endif
  23. goto again;
  24. else
  25. cout<< "accept error";
  26. }
  27. return(n);
  28. }
  29. void Bind(int fd, const struct sockaddr *sa, socklen_t salen){
  30. if (bind(fd, sa, salen) < 0)
  31. cout<< "bind error";
  32. }
  33. void Connect(int fd, const struct sockaddr *sa, socklen_t salen){
  34. if (connect(fd, sa, salen) < 0)
  35. cout<< "connect error";
  36. }
  37. void Getpeername(int fd, struct sockaddr *sa, socklen_t *salenptr){
  38. if (getpeername(fd, sa, salenptr) < 0)
  39. cout<<"getpeername error";
  40. }
  41. void Getsockname(int fd, struct sockaddr *sa, socklen_t *salenptr){
  42. if (getsockname(fd, sa, salenptr) < 0)
  43. cout<< "getsockname error";
  44. }
  45. void Getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlenptr){
  46. if (getsockopt(fd, level, optname, optval, optlenptr) < 0)
  47. cout<< "getsockopt error";
  48. }
  49. /* include Listen */
  50. void Listen(int fd, int backlog) {
  51. char *ptr;
  52. /*4can override 2nd argument with environment variable */
  53. if ( (ptr = getenv("LISTENQ")) != NULL)
  54. backlog = atoi(ptr);
  55. if (listen(fd, backlog) < 0)
  56. cout<< "listen error";
  57. }
  58. /* end Listen */
  59. #ifdef HAVE_POLL
  60. int Poll(struct pollfd *fdarray, unsigned long nfds, int timeout){
  61. int n;
  62. if ( (n = poll(fdarray, nfds, timeout)) < 0)
  63. cout<< "poll error";
  64. return(n);
  65. }
  66. #endif
  67. ssize_t Recv(int fd, void *ptr, size_t nbytes, int flags){
  68. ssize_t n;
  69. if ( (n = recv(fd, ptr, nbytes, flags)) < 0)
  70. cout<< "recv error";
  71. return(n);
  72. }
  73. ssize_t Recvfrom(int fd, void *ptr, size_t nbytes, int flags,
  74.  struct sockaddr *sa, socklen_t *salenptr){
  75. ssize_t n;
  76. if ( (n = recvfrom(fd, ptr, nbytes, flags, sa, salenptr)) < 0)
  77. cout<< "recvfrom error";
  78. return(n);
  79. }
  80. ssize_t Recvmsg(int fd, struct msghdr *msg, int flags){
  81. ssize_t n;
  82. if ( (n = recvmsg(fd, msg, flags)) < 0)
  83. cout<< "recvmsg error";
  84. return(n);
  85. }
  86. int Select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
  87.        struct timeval *timeout){
  88. int n;
  89. if ( (n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0)
  90. cout<< "select error";
  91. return(n); /* can return 0 on timeout */
  92. }
  93. void Send(int fd, const void *ptr, size_t nbytes, int flags){
  94. if (send(fd, ptr, nbytes, flags) != nbytes)
  95. cout<< "send error";
  96. }
  97. void Sendto(int fd, const void *ptr, size_t nbytes, int flags,
  98.    const struct sockaddr *sa, socklen_t salen){
  99. if (sendto(fd, ptr, nbytes, flags, sa, salen) != nbytes)
  100. cout<< "sendto error";
  101. }
  102. void Sendmsg(int fd, const struct msghdr *msg, int flags){
  103. int i;
  104. ssize_t nbytes;
  105. nbytes = 0; /* must first figure out what return value should be */
  106. for (i = 0; i < msg->msg_iovlen; i++)
  107. nbytes += msg->msg_iov[i].iov_len;
  108. if (sendmsg(fd, msg, flags) != nbytes)
  109. cout<< "sendmsg error";
  110. }
  111. void Setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen){
  112. if (setsockopt(fd, level, optname, optval, optlen) < 0)
  113. cout<< "setsockopt error";
  114. }
  115. void Shutdown(int fd, int how){
  116. if (shutdown(fd, how) < 0)
  117. cout<< "shutdown error";
  118. }
  119. /* include Socket */
  120. int Socket(int family, int type, int protocol){
  121. int n;
  122. if ( (n = socket(family, type, protocol)) < 0)
  123. cout<< "socket error";
  124. return(n);
  125. }
  126. /* end Socket */
  127. void Socketpair(int family, int type, int protocol, int *fd){
  128. int n;
  129. if ( (n = socketpair(family, type, protocol, fd)) < 0)
  130. cout<< "socketpair error";
  131. }
  132. ssize_t writen(int fd, const void *vptr, size_t n){
  133. size_t nleft;
  134. ssize_t nwritten;
  135. const char *ptr;
  136. ptr = (const char *)vptr;
  137. nleft = n;
  138. while (nleft > 0) {
  139. if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
  140. if (errno == EINTR)
  141. nwritten = 0; /* and call write() again */
  142. else
  143. return(-1); /* error */
  144. }
  145. nleft -= nwritten;
  146. ptr   += nwritten;
  147. }
  148. return(n);
  149. }
  150. /* end writen */
  151. void Writen(int fd, void *ptr, size_t nbytes){
  152. if (writen(fd, ptr, nbytes) != nbytes)
  153. cout <<"writen error";
  154. }
  155. static ssize_t my_read(int fd, char *ptr){
  156. static int read_cnt = 0;
  157. static char *read_ptr;
  158. static char read_buf[MAXLINE];
  159. if (read_cnt <= 0) {
  160. again:
  161. if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
  162. if (errno == EINTR)
  163. goto again;
  164. return(-1);
  165. } else if (read_cnt == 0)
  166. return(0);
  167. read_ptr = read_buf;
  168. }
  169. read_cnt--;
  170. *ptr = *read_ptr++;
  171. return(1);
  172. }
  173. ssize_t readline(int fd, void *vptr, size_t maxlen){
  174. int n, rc;
  175. char c, *ptr;
  176. ptr = (char *)vptr;
  177. for (n = 1; n < maxlen; n++) {
  178. if ( (rc = my_read(fd, &c)) == 1) {
  179. *ptr++ = c;
  180. if (c == 'n')
  181. break; /* newline is stored, like fgets() */
  182. } else if (rc == 0) {
  183. if (n == 1)
  184. return(0); /* EOF, no data read */
  185. else
  186. break; /* EOF, some data was read */
  187. } else
  188. return(-1); /* error, errno set by read() */
  189. }
  190. *ptr = 0; /* null terminate like fgets() */
  191. return(n);
  192. }
  193. /* end readline */
  194. ssize_t Readline(int fd, void *ptr, size_t maxlen){
  195. ssize_t n;
  196. if ( (n = readline(fd, ptr, maxlen)) < 0)
  197. cout <<"readline error";
  198. return(n);
  199. }
  200. void str_cli(FILE *fp, int sockfd){
  201. char sendline[MAXLINE], recvline[MAXLINE];
  202. fgets(sendline, MAXLINE, fp);
  203. Writen(sockfd, sendline, strlen(sendline));
  204. sendline[strlen(sendline)-1] = '';
  205. cout << "Sending Command: '" << sendline << "' to servern";
  206. if (Readline(sockfd, recvline, MAXLINE) == 0)
  207. cout << "str_cli: server terminated prematurely";
  208. for(int i=0;i<strlen(recvline);i++)
  209. if(recvline[i] == (char)(136))
  210. recvline[i] = 'n';
  211. fputs(recvline, stdout);
  212. }
  213. int main(int argc, char **argv){
  214. int sockfd;
  215. struct sockaddr_in servaddr;
  216. if (argc != 2)
  217. cout << "usage: tcpcli <IPaddress>";
  218. cout << "Please enter the Command to be sent to server :: ";
  219. sockfd = Socket(AF_INET, SOCK_STREAM, 0);
  220. bzero(&servaddr, sizeof(servaddr));
  221. servaddr.sin_family = AF_INET;
  222. servaddr.sin_port = htons(SERV_PORT);
  223. inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
  224. Connect(sockfd, (const  struct  sockaddr   *) &servaddr, sizeof(servaddr));
  225. str_cli(stdin, sockfd); /* do it all */
  226. exit(0);
  227. }