Linux下socket编程示范(一个服务…

socket编程的基础函数使用请自查询,本文只给出在linux gcc可编译运行的socket通信的服务器程序与客户端程序。
代码如下:server端



#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>                        //signal
#include <sys/socket.h>                  //socket
#include <netinet/in.h>             //sockaddr_in
#include <arpa/inet.h>
#include <string.h>                        //memset
const int BUFF_SIZE=10;
void process(int client_fd,int cmd)
{
      switch(cmd)
      {
      case 0:
            printf("rec cmd 0");break;
      case 1:
      default:
            printf("default %d\n",cmd);break;
      }
      send(client_fd,"OK",BUFF_SIZE,0);
}
int main(void) {
      int server_fd,client_fd;      //socket fd
      struct sockaddr_in my_addr;    //服务器网络地址结构体
      struct sockaddr_in remote_addr; //客户端网络地址结构体
      int cmd;
      char str[10];
      pid_t pid;
      unsigned int len;
//1.init
      memset(&my_addr,0,sizeof(my_addr));//数据初始化--清零
      my_addr.sin_family=AF_INET;             //设置为IP通信
      my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
      my_addr.sin_port=htons(8000);             //服务器端口号
//2.socket
      if( (server_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)//create socket;
      {
            perror("socket create failed");
            exit(-1);
      }
//3.bind
      if (bind(server_fd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
      {
            perror("bind failed");
            return 1;
      }
//4.listen
      listen(server_fd,5);
      puts("Now server begin listening ,the listen queue len is5");


      signal(SIGCLD,SIG_IGN);       //ignore teh detail of the child process exit

      int client_len = sizeof(remote_addr);
      while(1){
//5.accept
            if((client_fd=accept(server_fd,(struct sockaddr *)&remote_addr,&client_len))<0)
                  {
                          perror("accept");
                          return 1;
                  }
            if( (pid = fork())== 0)                  //child
            {
      //            client_fd= accept(server_fd,(struct sockaddr*)&remote_addr,&client_len);
      //            puts("a client connected");
//6.receive
                  printf("working for %s\n",inet_ntoa(remote_addr.sin_addr));
                  len = send(client_fd,"welcome!",BUFF_SIZE,0);
                  puts("send welcome!");
                  len = recv(client_fd,&cmd,sizeof(cmd),0);
                  process(client_fd,cmd);
                  close(client_fd);
                  exit(0);
            }
            if(pid)                              //parent
            {
                  puts("In parent process");
                  close(client_fd);
            //      puts("parent process over");
                  sleep(1);
            }
      }
      close(server_fd);
      return EXIT_SUCCESS;
}



#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>                        //signal
#include <sys/socket.h>                  //socket
#include <netinet/in.h>             //sockaddr_in
#include <arpa/inet.h>
#include <string.h>                        //memset
const int BUFF_SIZE=10;
int main(void) {
            int client_sockfd;
            int len,cmd;
            struct sockaddr_in remote_addr; //服务器端网络地址结构体
            char buf[BUFF_SIZE];  //数据传送的缓冲区
            memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
            remote_addr.sin_family=AF_INET; //设置为IP通信
            remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
            remote_addr.sin_port=htons(8000); //服务器端口号

           
            if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
            {
                    perror("socket");
                    return 1;
            }

           
            if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
            {
                    perror("connect");
                    return 1;
            }
            printf("connected to server\n");
            len=recv(client_sockfd,buf,BUFSIZ,0);//接收服务器端信息
                      buf[len]='/0';
            printf("received %s\n",buf); //打印服务器端信息

           
            puts("please input cmd");
            scanf("%d",&cmd);
                    len=send(client_sockfd,&cmd,4,0);
                    len=recv(client_sockfd,buf,BUFF_SIZE,0);
                    buf[len]='/0';
                        printf("received %s\n",buf); //打印服务器端信息

            close(client_sockfd);//关闭套接字
            return 0;
}

你可能感兴趣的:(Linux下socket编程示范(一个服务…)