Chinaunix首页 | 论坛 | 博客
  • 博客访问: 134781
  • 博文数量: 49
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 566
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-09 09:24
  • 认证徽章:
个人简介

水滴

文章分类

全部博文(49)

文章存档

2019年(8)

2018年(32)

2017年(9)

我的朋友

分类: LINUX

2017-04-19 10:12:24

tcp连接:
  1. #define SERVER_IP "127.0.0.1"  
  2. #define SERVER_PORT 8000  
  3.   
  4. #define MAX_RECV_LEN 1024  
  5. #define MAX_CLIENT_NUM 30  
  6. #define BACK_LOG 20  
  7.  
  8. static int running = 1;  
  9. int main(int argc, char *argv[])  
  10. {  
  11.     int sock_fd = -1;  
  12.     int ret = -1;  
  13.     struct sockaddr_in serv_addr;  
  14.     struct sockaddr_in cli_addr;  
  15.     socklen_t serv_addr_len = 0;  
  16.     socklen_t cli_addr_len = 0;  
  17.     int client_fd[MAX_CLIENT_NUM];  
  18.     char recv_buf[MAX_RECV_LEN];  
  19.     int new_conn_fd = -1;  
  20.     int i = 0;  
  21.     int max_fd = -1;  
  22.     int num = -1;  
  23.     struct timeval timeout;  
  24.   
  25.   
  26.     fd_set read_set;  
  27.     fd_set write_set;  
  28.     fd_set select_read_set;  
  29.   
  30.   
  31.     FD_ZERO(&read_set);  
  32.     FD_ZERO(&write_set);  
  33.     FD_ZERO(&select_read_set);  
  34.   
  35.     for (i = 0; i < MAX_CLIENT_NUM; i++)  
  36.     {  
  37.         client_fd[i] = -1;  
  38.     }   
  39.   
  40.     memset(&serv_addr, 0, sizeof(serv_addr));  
  41.     memset(&cli_addr, 0, sizeof(cli_addr));  
  42.   
  43.   
  44.     sock_fd = socket(AF_INET, SOCK_STREAM, 0);  
  45.     if (sock_fd < 0)  
  46.     {  
  47.         perror("Fail to socket");  
  48.         exit(1);  
  49.     }  
  50.   
  51.   
  52.     serv_addr.sin_family = AF_INET;  
  53.     serv_addr.sin_port = htons(SERVER_PORT);  
  54.     serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  55.   
  56.   
  57.     unsigned int value = 1;  
  58.     if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,  
  59.                 (void *)&value, sizeof(value)) < 0)  
  60.     {  
  61.         perror("Fail to setsockopt");  
  62.         exit(1);  
  63.     }  
  64.   
  65.   
  66.     serv_addr_len = sizeof(serv_addr);  
  67.     if (bind(sock_fd, (struct sockaddr*)&serv_addr, serv_addr_len) < 0)  
  68.     {  
  69.         perror("Fail to bind");  
  70.         exit(1);  
  71.     }  
  72.     if (listen(sock_fd, BACK_LOG) < 0)  
  73.     {  
  74.         perror("Fail to listen");  
  75.         exit(1);  
  76.     }  
  77.   
  78.     char buf[1024];  
  79.     max_fd = sock_fd;  
  80.     int len;  
  81.     FD_SET(sock_fd, &read_set);  
  82.     while (running)  
  83.     {  
  84.         timeout.tv_sec = 5;  
  85.         timeout.tv_usec = 0;  
  86.   
  87.   
  88.         max_fd = sock_fd;  
  89.         for (i = 0; i < MAX_CLIENT_NUM; i++)  
  90.         {  
  91.             if (max_fd < client_fd[i])  
  92.             {  
  93.                 max_fd = client_fd[i];  
  94.             }  
  95.         }  
  96.   
  97.   
  98.         select_read_set = read_set;  
  99.         ret = select(max_fd + 1, &select_read_set, NULL, NULL, &timeout);  
  100.         if (ret == 0)  
  101.         {  
  102.             printf("timeout\n");  
  103.         }  
  104.         else if (ret < 0)  
  105.         {  
  106.             printf("error occur\n");  
  107.         }  
  108.         else  
  109.         {  
  110.             if (FD_ISSET(sock_fd, &select_read_set))  
  111.             {  
  112.                 printf("new client comes\n");  
  113.                 len = sizeof(cli_addr);  
  114.                 new_conn_fd = accept(sock_fd, (struct sockaddr*)&cli_addr, &len);  
  115.                 if (new_conn_fd < 0)  
  116.                 {  
  117.                     perror("Fail to accept");  
  118.                     exit(1);  
  119.                 }  
  120.                 else  
  121.                 {  
  122.                     for (i = 0; i < MAX_CLIENT_NUM; i++)  
  123.                     {  
  124.                         if (client_fd[i] == -1)  
  125.                         {  
  126.                             client_fd[i] = new_conn_fd;  
  127.                             FD_SET(new_conn_fd, &read_set);  
  128.                             break;  
  129.                         }  
  130.                         if (max_fd < new_conn_fd)  
  131.                         {  
  132.                             max_fd = new_conn_fd;  
  133.                         }  
  134.                     }  
  135.                 }  
  136.             }  
  137.             else  
  138.             {  
  139.                 for (i = 0; i < MAX_CLIENT_NUM; i++)  
  140.                 {  
  141.                     if (-1 == client_fd[i]) {  
  142.                         continue;  
  143.                     }  
  144.                     memset(recv_buf, 0, MAX_RECV_LEN);  
  145.                     if (FD_ISSET(client_fd[i], &select_read_set))  
  146.                     {  
  147.                         num = read(client_fd[i], recv_buf, MAX_RECV_LEN);  
  148.                         if (num < 0)  
  149.                         {  
  150.                             printf("Client(%d) left\n", client_fd[i]);  
  151.                             FD_CLR(client_fd[i], &read_set);  
  152.                             close(client_fd[i]);  
  153.                             client_fd[i] = -1;  
  154.                         }  
  155.                         else if (num > 0)  
  156.                         {  
  157.                             recv_buf[num] = '\0';  
  158.                             printf("Recieve client(%d) data\n", client_fd[i]);  
  159.                             printf("Data: %s\n\n", recv_buf);  
  160.                         } if (num == 0)  
  161.                         {  
  162.                             printf("Client(%d) exit\n", client_fd[i]);  
  163.                             FD_CLR(client_fd[i], &read_set);  
  164.                             close(client_fd[i]);  
  165.                             client_fd[i] = -1;  
  166.                         }  
  167.                     }  
  168.                 }  
  169.             }  
  170.         }  
  171.     }  
  172.     return 0;  
  173. }  
  174.   
  175. 客户端:  
  176. #include   
  177. #include   
  178. #include   
  179. #include   
  180. #include   
  181. #include   
  182. #include   
  183. #include   
  184. #include   
  185.   
  186.   
  187. #define SERVER_IP "127.0.0.1"  
  188. #define SERVER_PORT 8000  
  189.   
  190.   
  191. #define MAX_RECV_LEN 1024  
  192.   
  193.   
  194. static int running = 1;  
  195.   
  196.   
  197. int main(int argc, char *argv[])  
  198. {  
  199.     int sock_fd = -1;  
  200.     int ret = -1;  
  201.     struct sockaddr_in serv_addr;  
  202.     struct sockaddr_in cli_addr;  
  203.     socklen_t serv_addr_len = 0;  
  204.   
  205.     memset(&serv_addr, 0, sizeof(serv_addr));  
  206.   
  207.   
  208.     sock_fd = socket(AF_INET, SOCK_STREAM, 0);  
  209.     if (sock_fd < 0)  
  210.     {  
  211.         perror("Fail to socket");  
  212.         exit(1);  
  213.     }  
  214.   
  215.   
  216.     serv_addr.sin_family = AF_INET;  
  217.     serv_addr.sin_port = htons(SERVER_PORT);  
  218.     serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  219.   
  220.   
  221.     serv_addr_len = sizeof(serv_addr);  
  222.     if (connect(sock_fd, (struct sockaddr *)&serv_addr, serv_addr_len) < 0)  
  223.     {  
  224.         perror("Fail to connect");  
  225.         exit(1);  
  226.     }  
  227.     char buf[1024];  
  228.     int num = 0;  
  229.     while (running)  
  230.     {  
  231.         num = read(STDIN_FILENO, buf, MAX_RECV_LEN);  
  232.         if (num > 0)  
  233.         {  
  234.             buf[num] = '\0';  
  235.             printf("buf: %s\n", buf);  
  236.             num = write(sock_fd, buf, num);  
  237.             if (num < 0)  
  238.             {  
  239.                 printf("write failed\n");  
  240.                 exit(1);  
  241.             }  
  242.   
  243.   
  244.             if (strncmp(buf, "exit", strlen("exit")) == 0)  
  245.             {  
  246.                 printf("Client exit\n");  
  247.                 close(sock_fd);  
  248.                 return 0;  
  249.             }   
  250.         }  
  251.     }  
  252.     return 0;  
  253. }  

UDP的通信的范例
编程步骤:
服务器(收数据):
1、创建socket(socket())得到socketfd
2、绑定本机ip(bind())一般绑定宏ip
3、先接受数据得到对方的ip和port(recvfrom())
4、发送数据(sendto())
5、关闭socketfd(close())


(发送数据)
1、创建socket(socket())得到socketfd
2、初始化对方主机的ip和端口号
3、发送数据(sendto)倒数第二参数为对方的ip和port号
4、接受数据
5、关闭socket(close())




服务器:
#include
#include
#include
#include
#include
#include
#include
#include


int main()
{    
    int socketfd = socket(AF_INET,SOCK_DGRAM,0);//1.创建udp套接字socket得到socketfd
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    //此处可以使用宏ip(=htonl(INADDR_ANY))该宏ip为一个整型数z转化为二进制L==long
    saddr.sin_addr.s_addr = inet_addr("192.168.193.2");
    if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0)//绑定本机的ip地址
        perror("bind() error!\n");
    
    struct sockaddr_in caddr;
    int s = sizeof(struct sockaddr);    
    char buf[20],buf1[20];
    int n;
    while(1)//收发数据
    {    
        bzero(buf,20);
        //scanf("%s",buf);    
        if(n = recvfrom(socketfd,buf,20,0,(struct sockaddr *)&caddr,&s)<0)
       //recvfrom的倒数第二个参数为对方的ip和端口号,recvfrom函数自动获取,因此sendto中的地址就填该结构体。
            perror("send() error!\n");
            printf("%s",buf);
            fgets(buf1,20,stdin);
            sendto(socketfd,buf1,strlen(buf),0,(struct sockaddr *)&caddr,s);
    }    
    close(socketfd);//关闭套接字socketfd
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#include


int main()
{    
    int socketfd = socket(AF_INET,SOCK_DGRAM,0);//创建udp套接字得到socketfd文件描述符
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = inet_addr("192.168.193.2");

    struct sockaddr_in caddr;
    int s = sizeof(struct sockaddr);    
    char buf[20],buf1[20];
    int n;
    while(1)//发送接收数据.
    {    
        //bzero(buf,20);    
        fgets(buf,20,stdin);
        if(n = sendto(socketfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,s)<0)
            perror("recv() error!\n");
        //printf("%d\n",n);
        bzero(buf1,20);
        recvfrom(socketfd,buf1,20,0,(struct sockaddr *)&caddr,&s);
        printf("%s",buf1);
    }    
    close(socketfd);//关闭socketfd
}

阅读(983) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册