Linux-IO関数の例(send/recv)

31807 ワード

send()関数はデータの送受信に用いられ、プロトタイプは以下の通りである:#include#include ssize_t send(int s,const void* buf,size_t len,int flag); バッファbufのlenサイズのデータをソケットファイル記述子でflag指定で送信します.正常に送信されたバイト数を返します.
recv()関数はデータを受信するために使用され、プロトタイプは以下の通りである:#include#include ssize_t recv(int s,const void* buf,size_t len,int flag); ソケットsからデータを受信し、バッファbufに格納し、bufの長さはlenであり、操作方式はflagによって決定される.
クライアントプログラムフレームワークのステップは以下の通りである:(1)プログラムの入力パラメータを判断し、接続するサーバIPアドレス(2)フック信号SIGINTの処理関数とsig_proccess()とSIGPIPIEの処理関数sig_pipe()は、サブプロセス終了信号とソケット接続が切断された場合を処理するために使用される.(3)ストリームソケットを確立し、その結果sに配置する(4)バインドするアドレス構造に値を付与し、IPアドレスがネイティブアドレス、ポート番号8888(5)接続サーバ(6)呼び出し関数proccess_conn_クライアント()はクライアントデータの処理を行い,この関数は異なるモードで送受信関数の実現方式が異なる.(7)処理完了後ソケットを閉じる
1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<unistd.h>
  6 #include<netinet/in.h>
  7 #include<signal.h>
  8 extern void sig_proccess(int signo);
  9 extern void sig_pipe(int signo);
 10 #define PORT 8888//   
 11 static int s;
 12 
 13 void proccess_conn_client(int s)
 14 {
 15     ssize_t size = 0;
 16     char buffer[1024];
 17 
 18     while(1)
 19     {
 20         size = read(0,buffer,1024);//             b    uffer 
 21 
 22         if(size > 0)
 23         {
 24             send(s,buffer,size,0);// buffer          
 25             size = recv(s,buffer,1024,0);//          b    uffer 
 26             write(1,buffer,size);// buffer         
 27         }
 28     }
 29 }
 30 
 31 void sig_proccess(int signo)
 32 {
 33     printf("Catch a exit signal
"
); 34 _exit(0); 35 } 36 37 void sig_pipe(int sign) 38 { 39 printf("Catch a SIGPIPE signal
"
); 40 41 } 42 int main() 43 { 44 printf("
"
); 45 struct sockaddr_in server_addr; 46 int err; 47 48 signal(SIGINT,sig_proccess); 49 signal(SIGPIPE,sig_pipe); 50 51 s = socket(AF_INET,SOCK_STREAM,0); 52 if(s<0) 53 { 54 perror("socket error"); 55 return -1; 56 } 57 58 bzero(&server_addr,sizeof(server_addr)); 59 server_addr.sin_family = AF_INET; 60 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 61 62 server_addr.sin_port = htons(PORT); 63 64 connect(s,(struct sockaddr*)&server_addr,sizeof(struct socka ddr)); 65 proccess_conn_client(s); 66 close(s); 67 return 0; 68 }

サーバ側
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/socket.h>
  6 #include<unistd.h>
  7 #include<netinet/in.h>
  8 #include<signal.h>
  9 
 10 extern void sign_proccess(int signo);
 11 #define PORT 8888
 12 #define BACKLOG 2
 13 
 14 void proccess_conn_server(int s)
 15 {
 16     ssize_t size = 0;
 17     char buffer[1024];
 18 
 19     while(1)
 20     {
 21         size = recv(s,buffer,1024,0);
 22 
 23         if(size == 0)
 24         {
 25             return ;
26         }
 27         sprintf(buffer,"             :%d",size);
 28         send(s,buffer,strlen(buffer)+1,0);
 29     }
 30 }
 31 
 32 void sig_proccess(int signo)
 33 {
 34     printf("Catch a exit signal
"
); 35 _exit(0); 36 } 37 38 void sig_pipe(int sign) 39 { 40 printf("Catch a SIGPIPE signal
"
); 41 } 42 43 int main() 44 { 45 int ss,sc; 46 struct sockaddr_in server_addr; 47 struct sockaddr_in client_addr; 48 int err; 49 50 pid_t pid; 51 52 signal(SIGINT,sig_proccess); 53 signal(SIGPIPE,sig_pipe); 54 55 ss = socket(AF_INET,SOCK_STREAM,0); 56 if(ss < 0) 57 { 58 perror("socket error"); 59 return -1; 60 } 61 62 bzero(&server_addr,sizeof(server_addr)); 63 server_addr.sin_family=AF_INET; 64 server_addr.sin_addr.s_addr=htonl(INADDR_ANY); 65 server_addr.sin_port = htons(PORT); 66 67 err = bind(ss,(struct sockaddr*)&server_addr,sizeof(server_a ddr)); 68 69 if(err < 0) 70 { 71 perror("bind error"); 72 return -1; 73 } 74 75 err = listen(ss,BACKLOG); 76 if(err < 0) 77 { 78 perror("listen error"); 79 return -1; 80 } 81 82 while(1) 83 { 84 int addrlen = sizeof(struct sockaddr); 85 sc = accept(ss,(struct sockaddr*)&client_addr,&addrlen); 86 if(sc < 0) 87 { 88 perror("accept error"); 89 return -1; 90 } 91 92 pid = fork(); 93 if(pid == 0) 94 { 95 close(ss); 96 proccess_conn_server(sc); 97 } 98 else 99 { 100 close(sc); 101 } 102 } 103 return 0; 104 } 105