fork(1) download
  1. /* minitalk クライアントプログラム */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netdb.h>
  7. #include <netinet/in.h>
  8.  
  9. int CanIRecv(int fd){
  10. fd_set fdset;
  11. struct timeval timeout;
  12. FD_ZERO( &fdset );
  13. FD_SET( fd , &fdset );
  14. timeout.tv_sec = 0;
  15. timeout.tv_usec = 0;
  16. return select( fd+1 , &fdset , NULL , NULL , &timeout );
  17. }
  18.  
  19.  
  20. void get_ipaddr(const char *hostname, struct in_addr *paddr)
  21. {
  22. struct hostent *phost;
  23.  
  24. /* まず文字列がホスト名と仮定して検索 */
  25. phost = gethostbyname(hostname);
  26. if (phost != NULL) {
  27. memcpy(paddr, phost->h_addr_list[0], sizeof(struct in_addr));
  28. return;
  29. }
  30.  
  31. /* 検索に失敗した場合、文字列を IP アドレスとして検索 */
  32. paddr->s_addr = inet_addr(hostname);
  33. }
  34.  
  35. int main(int argc, char *argv[])
  36. {
  37. int sock, port;
  38. struct sockaddr_in srv_addr, cli_addr;
  39. int addrlen, sendlen, recvlen;
  40. char servhost[256], buf[256];
  41.  
  42. /* ポート番号を引数から取得 */
  43. strncpy(servhost, argv[1], sizeof(servhost) - 1);
  44. port = strtol(argv[2], NULL, 10);
  45.  
  46. /* ソケットの作成 */
  47. sock = socket(AF_INET, SOCK_STREAM, 0);
  48. if (sock < 0) {
  49. perror("cannot create socket");
  50. exit(-1);
  51. }
  52.  
  53. /* サーバとしてバインド */
  54. srv_addr.sin_family = AF_INET;
  55. srv_addr.sin_port = htons(port);
  56. get_ipaddr(servhost, &srv_addr.sin_addr);
  57. if (connect(sock, (struct sockaddr*)&srv_addr, sizeof(srv_addr)) < 0) {
  58. perror("connect failed");
  59. exit(-1);
  60. }
  61. printf("connected\n");
  62. printf("waiting a message from server... \n");
  63.  
  64. /* 実際の通信 */
  65. while (feof(stdin) == 0) {
  66.  
  67. if(CanIRecv(0)){
  68. /* 標準入力からキーボード入力された文字を読み込む */
  69. printf("message : ");
  70. fgets(buf, sizeof(buf), stdin);
  71. /* 読み込んだ文字をソケットに書き込む */
  72. sendlen = write(sock, buf, strlen(buf) + 1);
  73. if (sendlen < 0) {
  74. perror("cannot send a message");
  75. }
  76. }
  77.  
  78.  
  79. if (CanIRecv(sock)) {
  80. /* ソケットからのデータを読み込む */
  81. recvlen = read(sock, buf, sizeof(buf));
  82. if (recvlen <= 0) {
  83. /* クライアント側が EOF */
  84. break;
  85. }
  86. printf(">> %s", buf);
  87. }
  88. }
  89. close(sock);
  90. }
  91.  
  92.  
Runtime error #stdin #stdout 0.01s 1672KB
stdin
Standard input is empty
stdout
Standard output is empty