Linux—IO函数的例子(send/recv)

send()
函数用于收发数据,原型如下:
#include<sys/types.h>
#include<sys/socket.h>
ssize_t send(int s,const void* buf,size_t len,int flag);
将缓冲区buf中大小为len的数据,通过套接字文件描述符按照flag指定的方式发送出去。返回值为成功发送的字节数。

recv()
函数用于接收数据,原型如下:
#include<sys/types.h>
#include<sys/socket.h>
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_client()进行客户端数据的处理,这个函数在不同的模式下,收发函数的实现方式不同。
(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\n");
 34     _exit(0);
 35 }
 36 
 37 void sig_pipe(int sign)
 38 {
 39     printf("Catch a SIGPIPE signal\n");
 40 
 41 }
 42 int main()
 43 {
 44     printf("你好啊\n");
 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\n");
 35     _exit(0);
 36 }
 37 
 38 void sig_pipe(int sign)
 39 {
 40     printf("Catch a SIGPIPE signal\n");
 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 

猜你喜欢

转载自blog.csdn.net/weixin_44545549/article/details/106794350