socket通信聊天通信

在linux下,可以利用socket通信建立起简单的聊天协议,以下就是运行在linux下的简单聊天通信,分为服务端server.c和客户端client.c。

//server.c - gcc -o s server.c
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>


#define EHCO_PORT 8080
#define MAX_CLLENT_NUM 10


int main()
{
    int sock_fd;
    struct sockaddr_in serv_addr;
    int clientfd;
    struct sockaddr_in clientAdd;
    char buff[101];
    socklen_t len;
    int n;
    /*socket*/
    sock_fd=socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd==-1){
       perror("creket socket error!");
       return 0;
    }
    else{
       printf("success to create socket %d\n",sock_fd);
    }


    bzero(&serv_addr,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(EHCO_PORT);
    serv_addr.sin_addr.s_addr=htons(INADDR_ANY);
    bzero(&(serv_addr.sin_zero),8);


    if(bind(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))!=0){
       printf("bind address fail!%d\n", errno);
       close(sock_fd);
       return 0;
    }else{
       printf("success to bind address!\n");
    }


    if(listen(sock_fd,MAX_CLLENT_NUM)!=0){
       perror("listen socket error !\n");
       close(sock_fd);
       return 0;
    }else{
       printf("success to listen!\n");
    }


    len =sizeof(clientAdd);
    clientfd=accept(sock_fd,(struct sockaddr*)&clientAdd,&len);
    if(clientfd<=0)
    {
      perror("accept() error!\n");
      close(sock_fd);
      return 0;
    }


    while((n=recv(clientfd,buff,100,0))>0){
       buff[n]='\0';
       printf("number of receive bytes=%d data =%s\n",n,buff);


       fflush(stdout);
       send(clientfd,buff,n,0);
       if(strncmp(buff,"quit",4)==0)
       break;
     }
         close(clientfd);
close(sock_fd);
return 0;
}





//client - gcc -o client.c

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>


#define EHCO_PORT 8080
#define MAX_COMMAND 5


int main()
{
   int sock_fd;
   struct sockaddr_in serv_addr;


   char *buff[MAX_COMMAND]={"abc","def","test","hello","quit"};
   char tmp_buf[100];
   int n,i;
   sock_fd =socket(AF_INET,SOCK_STREAM,0);
   if(sock_fd==-1){
     perror("create socket error!\n");
     return 0;
   }
   else{
      printf("success to create socket %d\n",sock_fd);
   }


  bzero(&serv_addr,sizeof(serv_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(EHCO_PORT);
  serv_addr.sin_addr.s_addr=htons(INADDR_ANY);
  bzero(&(serv_addr.sin_zero),8);


  if(-1==connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))){
      perror("connect() error!\n");
      close(sock_fd);
      return 0;
  }
   printf("success connect to server!\n");


   for(i=0;i<MAX_COMMAND;i++)
   {
    send(sock_fd,buff[i],100,0);
    n=recv(sock_fd,tmp_buf,100,0);
    tmp_buf[n]='\0';
    printf("data sent:%s receive:%s\n",buff[i],tmp_buf);
    if(0==strncmp(tmp_buf,"quit",4))
    break;
   }
   close(sock_fd);
   return 0;
}

猜你喜欢

转载自blog.csdn.net/scanf_linux/article/details/80787339