ネットワーク実験プログラミング1 (UDP まずはserver側)

ネットワーク実験プログラミング1 (UDP まずはserver側)

[root@cent5-4 chap3]# cat my-udpc2.c 
#include 
#include 
#include 
#include 
#include 
#include 
#define BUFSIZE 65500

enum {CMD_NAME,DST_PORT} ;   // CMD_NAME==0 , DST_PORT==1になる

int main(int argc, char * argv[])
{
 
 int port;
 int DEFAULT_PORT = 5320;
 struct sockaddr_in server;
 int s;   // socket descriptor



//                                       // port selection
 if (argc == 2 ) {
  port = atoi(argv[DST_PORT]);
  //printf("%d\n",port);
  
 } else {
  port = DEFAULT_PORT;
 }

//名前 socket - 通信のための端点(endpoint)を作成する
// 書式
//     #include 
//       #include 
// int socket(int domain, int type, int protocol);

 s = socket(PF_INET, SOCK_DGRAM , 0);  

 if ( s < 0 ) {
 perror("socket");
 exit(EXIT_FAILURE);
 }
 //printf("s:%d\n",s);       // print socketdescriptor

 
 //   名前 memset - ある一定のバイトでメモリ領域を埋める。

 //   #include 
 //   void *memset(void *s, int c, size_t n);
 //   説明
 //     memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。
 //   返り値
 //    memset() は s へのポインタを返す。
       
 //   struct sockaddr_in server; の初期化(all zero化)

     memset*1;
     server.sin_family = PF_INET ;
     server.sin_addr.s_addr = htonl(INADDR_ANY);
     server.sin_port = htons(port);

//NAME htonl,  htons,  ntohl,  ntohs - convert values between host and network
//     byte order
//
//SYNOPSIS
//       #include 
//       uint32_t htonl(uint32_t hostlong);
//       uint16_t htons(uint16_t hostshort);
//       uint32_t ntohl(uint32_t netlong);
//       uint16_t ntohs(uint16_t netshort);

    if ( bind(s,(struct sockaddr *) &server , sizeof(server))  < 0 ) {
     perror("bind");
     exit(EXIT_FAILURE);
    }

//     #include 
//     int bind(int socket, const struct sockaddr *address, socklen_t address_len);
//     Upon successful completion, bind() shall return 0; otherwise, -1  shall
//     be returned and errno set to indicate the error.
 

/////////////////////////  main routine ///////////////////////////////////

 struct sockaddr_in client;
 int len;
 int rn;
 char recv_buf[BUFSIZE];

len = sizeof(client);
while(1) {
rn = recvfrom( s , recv_buf , BUFSIZE - 1 , 0 ,
             (struct sockaddr *) &client ,&len);


//       recv, recvfrom, recvmsg - receive a message from a socket
//
//       #include 
//       #include 

//       ssize_t recvfrom(int s, void *buf, size_t len, int flags,
//                        struct sockaddr *from, socklen_t *fromlen);
recv_buf[rn] = '\n' ;
printf("received: %s\n",recv_buf);

sendto(s , recv_buf , BUFSIZE , 0 ,
       (struct sockaddr *) &client , len);

//名前  send, sendto, sendmsg - ソケットへメッセージを送る
//書式
//       #include 
//       #include 
//       ssize_t  sendto(int  s,  const  void *buf, size_t len, int flags, const
//       struct sockaddr *to, socklen_t tolen);


}  // end of while




close(s);
}  // end of main
[root@cent5-4 chap3]# gcc -o my-udpc2 my-udpc2.c 



*1:char *) &server , 0 , sizeof(server