zoukankan      html  css  js  c++  java
  • UDP实现并发服务器

    server端

     1 #include <string.h>
     2 #include <stdio.h>
     3 #include <unistd.h>
     4 #include <arpa/inet.h>
     5 #include <ctype.h>
     6 
     7 #define SERV_PORT 8000
     8 
     9 int main(void)
    10 {
    11     struct sockaddr_in serv_addr, clie_addr;
    12     socklen_t clie_addr_len;
    13     int sockfd;
    14     char buf[BUFSIZ];
    15     char str[INET_ADDRSTRLEN];
    16     int i, n;
    17 
    18     sockfd = socket(AF_INET, SOCK_DGRAM, 0);    //SOCK_DGRAM通过UDP创建套接字
    19 
    20     bzero(&serv_addr, sizeof(serv_addr)); //初始化地址信息
    21     serv_addr.sin_family = AF_INET;
    22     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    23     serv_addr.sin_port = htons(SERV_PORT);
    24 
    25     bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));  //绑定 服务器端 地址
    26 
    27     printf("Accepting connections ...
    ");
    28     while (1) {
    29         clie_addr_len = sizeof(clie_addr);
    30         n = recvfrom(sockfd, buf, BUFSIZ,0, (struct sockaddr *)&clie_addr, &clie_addr_len);    //从sockfd读数据,将数据来源保存在clie_addr中
    31         if (n == -1)
    32             perror("recvfrom error");
    33 
    34         printf("received from %s at PORT %d
    ",
    35                 inet_ntop(AF_INET, &clie_addr.sin_addr, str, sizeof(str)),
    36                 ntohs(clie_addr.sin_port));
    37 
    38         for (i = 0; i < n; i++)
    39             buf[i] = toupper(buf[i]);
    40 
    41         n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&clie_addr, sizeof(clie_addr));   //往sockfd写数据,并发送给 clie_addr
    42         if (n == -1)
    43             perror("sendto error");
    44     }
    45     close(sockfd);
    46 
    47     return 0;
    48 }

    客户端

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <unistd.h>
     4 #include <arpa/inet.h>
     5 #include <ctype.h>
     6 
     7 #define SERV_PORT 8000
     8 
     9 int main(int argc, char *argv[])
    10 {
    11     struct sockaddr_in servaddr;
    12     int sockfd, n;
    13     char buf[BUFSIZ];
    14 
    15     sockfd = socket(AF_INET, SOCK_DGRAM, 0);   //SOCK_DGRAM通过 UDP 创建套接字
    16 
    17     bzero(&servaddr, sizeof(servaddr));
    18     servaddr.sin_family = AF_INET;
    19     inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
    20     servaddr.sin_port = htons(SERV_PORT);
    21 
    22     while (fgets(buf, BUFSIZ, stdin) != NULL) {
    23         n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); //向sockfd写数据,发送给 servaddr
    24         if (n == -1)
    25             perror("sendto error");
    26 
    27         n = recvfrom(sockfd, buf, BUFSIZ, 0, NULL, 0);         //NULL:不关心对端信息
    28         if (n == -1)
    29             perror("recvfrom error");
    30 
    31         write(STDOUT_FILENO, buf, n);
    32     }
    33 
    34     close(sockfd);
    35 
    36     return 0;
    37 }
  • 相关阅读:
    队列

    Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED
    连续三月涨势明显,PostgreSQL 将崛起?
    Oracle物理DG自动切换——Dataguard Broker配置
    MSSQL索引视图(indexed view)之简述及使用
    连续三月涨势明显,PostgreSQL 将崛起?
    Scheduler & Task & Worker & Thread & Request & Session & Connection of SQL Server
    MSSQL内存架构及管理
    MSSQL数据库后台进程(线程)
  • 原文地址:https://www.cnblogs.com/sclu/p/11310957.html
Copyright © 2011-2022 走看看