zoukankan      html  css  js  c++  java
  • [linux]小程序:UDP下client向server传输多个字符串

    还是实验的作业~

    一共需要两个文件,这是client

     1 #include <stdio.h>
     2 #include <sys/socket.h>
     3 #include <arpa/inet.h>
     4 #include <stdlib.h>
     5 #include <string.h>
     6 #include <unistd.h>
     7 
     8 #define ECHOMAX 255
     9 
    10 int main(int argc, char *argv[]) {
    11     int sock;
    12     struct sockaddr_in echoServAddr;
    13     struct sockaddr_in fromAddr;
    14     unsigned short echoServPort;
    15     unsigned int fromSize;
    16     char *servIP;
    17     char *echoString;
    18     char echoBuffer[ECHOMAX+1];
    19     int echoStringLen=0;
    20     int respStringLen;
    21     int i;//for counting
    22 
    23     if (argc<3) {
    24         printf("Usage:%s <Server IP> <Echo Port> [<Echo Words>]
    ",argv[0]);
    25         exit(1);
    26     }
    27 
    28     servIP = argv[1];
    29     
    30     for(i=3;i<argc;i++){
    31         echoStringLen = echoStringLen + strlen(argv[i]);
    32     }
    33     if (echoStringLen > ECHOMAX)
    34         printf("Echo word too long.
    ");
    35 
    36     echoServPort = atoi(argv[2]);
    37 
    38     if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)
    39         printf("socket() failed.
    ");
    40     memset(&echoServAddr,0,sizeof(echoServAddr));
    41     echoServAddr.sin_family = AF_INET;
    42     echoServAddr.sin_addr.s_addr = inet_addr(servIP);
    43     echoServAddr.sin_port = htons(echoServPort);
    44 
    45     for(i=3;i<argc;i++) {
    46         echoString = argv[i];
    47         if ((sendto(sock,echoString,strlen(echoString),0,(struct sockaddr *)&echoServAddr,sizeof(echoServAddr))) != strlen(echoString))
    48         printf("sendto() sent a different number of bytes than expected.
    ");
    49         }
    50     }
    51     echoBuffer[strlen(echoString)] = '';
    52     close(sock);
    53     exit(0);
    54 }
    55     

    这是server

    #include <stdio.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    #define ECHOMAX 255
    
    int main(int argc,char *argv[]) {
        int sock;
        struct sockaddr_in echoServAddr;
        struct sockaddr_in echoClntAddr;
        unsigned int cliAddrLen;
        char echoBuffer[ECHOMAX];
        unsigned short echoServPort;
        int recvMsgSize;
        int i;//for counting
        if (argc != 2) {
            printf("Usage: %s <UDP SERVER PORT>
    ",argv[0]);
            exit(1);
        }
    
        echoServPort = atoi(argv[1]);
    
        if ((sock = socket(PF_INET,SOCK_DGRAM,0)) < 0)
            printf("socket() failed.
    ");
    
        memset(&echoServAddr,0,sizeof(echoServAddr));
        echoServAddr.sin_family = AF_INET;
        echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        echoServAddr.sin_port = htons(echoServPort);
    
        if ((bind(sock,(struct sockaddr *)&echoServAddr,sizeof(echoServAddr))) <0)
            printf("bind() failed.
    ");
    
        for (;;) {
            cliAddrLen = sizeof(echoClntAddr);
            if ((recvMsgSize = recvfrom(sock,echoBuffer,strlen(echoBuffer),0,(struct sockaddr *)&echoClntAddr,&cliAddrLen)) < 0)
                printf("recvfrom() failed.
    ");
            printf("Handling client %s
    ",inet_ntoa(echoClntAddr.sin_addr));
    
        printf("Message: ");
        for(i=0;i<recvMsgSize;i++) {
            printf("%c",echoBuffer[i]);
            if(i==(recvMsgSize-1))
            printf("
    ");
            }
        }
        printf("
    ");
    }

    使用示例:

    例如想要传输的字符串为Hello, world!

    那么首先需要运行server:

    ./server 1500

    1500是端口号(其实在普通用户的权限下,使用一个>1024的端口就可以)

    然后运行client:(按alt+F2切换到新窗口运行)

    ./client 127.0.0.1 1500 Hello, world!

    然后alt+F1返回原来的窗口,可以看到:

    Handling client 127.0.0.1

    Message: Hello,

    Handling client 127.0.0.1

    Message: world!

  • 相关阅读:
    Nova创建虚拟机的底层代码分析
    Chapter 1 Securing Your Server and Network(12):保护链接server
    c语言实现hashtable,相似C++的map和iOS的NSDictionary
    Android_Training
    Bean Validation 技术规范特性概述
    linux下串口调试工具/串口终端推荐: picocom
    Android:主题(Theme)
    oracle database 12c R1 安装文档
    python版本wifi共享工具
    iOS 6编程Cookbook(影印版)
  • 原文地址:https://www.cnblogs.com/zxysmalleyes/p/5370438.html
Copyright © 2011-2022 走看看