ネットワーク実験プログラミング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