zoukankan      html  css  js  c++  java
  • Socket网络编程--聊天程序(1)

      很早的一段时间,看了APUE和UNPv1了解了网络编程,但是但是只是看而已,没有具体的实践,趁现在没有什么事做,就来实践了解一下网络编程。写博客保存下来,方便以后用到的时候可以查到。

      此次的聊天程序是迭代开发的。就是一步一步的修改成不同功能的聊天程序。

      服务器server和客户端client

      

      一对一,server和client是每人一句话聊天

      讲解几个函数gethostbyname(),这个函数以前讲过就不多说了。

      socket函数

      #include <sys/socket.h>

      int socket(int domain, int type, int protocol);    //返回值:若成功则返回文件(套接字)描述符,若出错则返回-1

      connect函数

      #include <sys/socket.h>

      int connect(int sockfd, const struct sockaddr *addr, socklen_t len);   //返回值:若成功则返回0,若出错则返回-1

      bind函数

      #include <sys/socket.h>

      int bind(int sockfd, const struct sockaddr *addr, socklen_t len);   //返回值:若成功则返回0,若出错则返回-1

      listen函数

      #include <sys/socket.h>

      int listen(int sockfd, int backlog);  //返回值:若成功则返回0,若出错则返回-1,backlog表示连接请求数量

      accept函数

      #include <sys/socket.h>

      int accept(int socdfd, struct sockaddr *restrict addr, socklen_t * restrict len); //若成功则返回文件(socket套接字)描述符,若出错则返回-1

      recv函数

      #include <sys/socket.h>

      ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);  //返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-1

      send函数

      #include <sys/socket.h>

      ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);  //返回值:若成功则返回发送的字节数,若出错则返回-1

      fgets函数

      #include <stdio.h>

      char *fgets(char *s, int size, FILE *stream);

       介绍完函数后,就直接贴出代码。

      client.c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <errno.h>
     4 #include <string.h>
     5 #include <netdb.h> //for gethostbyname
     6 #include <sys/types.h>
     7 #include <sys/socket.h>
     8 #include <netinet/in.h>
     9 #include <arpa/inet.h>
    10 
    11 #define MAX_BUF 4096
    12 #define SERVER_PORT 12138
    13 
    14 
    15 int main(int argc,char *argv[])
    16 {
    17     int sockfd;//socket
    18     char sendBuf[MAX_BUF],recvBuf[MAX_BUF];
    19     int sendSize,recvSize;//用于记录记录发送和接收到数据的大小
    20     struct hostent * host;
    21     struct sockaddr_in servAddr;
    22     char username[32];
    23     char * p;
    24 
    25     if(argc != 3)
    26     {
    27         perror("use: ./client [hostname] [username]");
    28         exit(-1);
    29     }
    30     p=username;
    31     strcpy(p,argv[2]);
    32     printf("username:%s
    ",username);
    33     host=gethostbyname(argv[1]);
    34     if(host==NULL)
    35     {
    36       perror("fail to get host by name.");
    37         exit(-1);
    38     }
    39     printf("Success to get host by name ...
    ");
    40 
    41     //创建socket
    42     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    43     {
    44       perror("fail to establish a socket");
    45       exit(1);
    46     }
    47     printf("Success to establish a socket...
    ");
    48     
    49     /*init sockaddr_in*/
    50     servAddr.sin_family=AF_INET;
    51     servAddr.sin_port=htons(SERVER_PORT);
    52     servAddr.sin_addr=*((struct in_addr *)host->h_addr);
    53     bzero(&(servAddr.sin_zero),8);
    54 
    55     /*connect the socket*/
    56     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
    57     {
    58       perror("fail to connect the socket");
    59       exit(1);
    60     }
    61     printf("Success to connect the socket...
    ");
    62 
    63     //send-recv
    64     while(1)
    65     {
    66         printf("Input:");
    67         fgets(sendBuf,MAX_BUF,stdin);
    68         send(sockfd,sendBuf,strlen(sendBuf),0);
    69         memset(sendBuf,0,sizeof(sendBuf));
    70         recv(sockfd,recvBuf,MAX_BUF,0);
    71         printf("Server:%s
    ",recvBuf);
    72         memset(recvBuf,0,sizeof(recvBuf));
    73     }
    74 
    75     return 0;
    76 }

      server.c

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <errno.h>
      4 #include <string.h>
      5 #include <netdb.h>
      6 #include <sys/types.h>
      7 #include <sys/socket.h>
      8 #include <sys/time.h>
      9 #include <sys/un.h>
     10 #include <sys/ioctl.h>
     11 #include <sys/wait.h>
     12 #include <netinet/in.h>
     13 #include <arpa/inet.h>
     14 
     15 
     16 #define SERVER_PORT 12138
     17 #define BACKLOG 20
     18 #define MAX_CON_NO 10
     19 #define MAX_DATA_SIZE 4096
     20 
     21 int main(int argc,char *argv[])
     22 {
     23     struct sockaddr_in serverSockaddr,clientSockaddr;
     24     char sendBuf[MAX_DATA_SIZE],recvBuf[MAX_DATA_SIZE];
     25     int sendSize,recvSize;
     26     int sockfd,clientfd;
     27     int on=1;
     28     int sinSize=0;
     29     char username[32];
     30 
     31     if(argc != 2)
     32     {
     33         printf("usage: ./server [username]
    ");
     34         exit(1);
     35     }
     36     strcpy(username,argv[1]);
     37     printf("username:%s
    ",username);
     38 
     39     /*establish a socket*/
     40     if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
     41     {
     42         perror("fail to establish a socket");
     43         exit(1);
     44     }
     45     printf("Success to establish a socket...
    ");
     46 
     47     /*init sockaddr_in*/
     48     serverSockaddr.sin_family=AF_INET;
     49     serverSockaddr.sin_port=htons(SERVER_PORT);
     50     serverSockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
     51     bzero(&(serverSockaddr.sin_zero),8);
     52 
     53     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
     54 
     55     /*bind socket*/
     56     if(bind(sockfd,(struct sockaddr *)&serverSockaddr,sizeof(struct sockaddr))==-1)
     57     {
     58         perror("fail to bind");
     59         exit(1);
     60     }
     61     printf("Success to bind the socket...
    ");
     62 
     63     /*listen on the socket*/
     64     if(listen(sockfd,BACKLOG)==-1)
     65     {
     66         perror("fail to listen");
     67         exit(1);
     68     }
     69 
     70     /*accept a client's request*/
     71     if((clientfd=accept(sockfd,(struct sockaddr  *)&clientSockaddr, &sinSize))==-1)
     72     {
     73         perror("fail to accept");
     74         exit(1);
     75     }
     76     printf("Success to accpet a connection request...
    ");
     77     printf(" %s join in!
    ",inet_ntoa(clientSockaddr.sin_addr));
     78     while(1)
     79     {
     80         /*receive datas from client*/
     81         if((recvSize=recv(clientfd,recvBuf,MAX_DATA_SIZE,0))==-1)
     82         {
     83             perror("fail to receive datas");
     84             exit(1);
     85         }
     86         printf("%s
    ",recvBuf);
     87         memset(recvBuf,0,MAX_DATA_SIZE);
     88 
     89         /*send datas to client*/
     90         printf("Server:");
     91         fgets(sendBuf,MAX_DATA_SIZE,stdin);
     92         if((sendSize=send(clientfd,sendBuf,strlen(sendBuf),0))!=strlen(sendBuf))
     93         {
     94             perror("fail to send datas");
     95             exit(1);
     96         }
     97         printf("Success to send datas
    ");
     98         memset(sendBuf,0,MAX_DATA_SIZE);
     99     }
    100 
    101     return 0;
    102 }

       这些代码都比较简单,详细的讲解网上都有,这里就不多说了。

      

      本文地址: http://www.cnblogs.com/wunaozai/p/3870156.html

  • 相关阅读:
    window.open()参数列表
    感受教育,焦点访谈
    《迷墙》
    锻炼身体
    Great Fire Wall
    今天
    查询重复记录的SQL语句
    Oracle,SQL Server,Access万能数据库通用类!
    经典SQL语句大全
    C#编码规范
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3870156.html
Copyright © 2011-2022 走看看