zoukankan      html  css  js  c++  java
  • TCP,UDP发送数据

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

    #define MAXLINE 80
    #define TRUE 1
    #define FALSE 0
    #define TCP_ENABLE 1
    #define UDP_ENABLE 0
    /*
    ./a.out -i [ip] -p [port] -s [message] -r -[t|u]
    */

    int main(int argc, char *argv[])
    {
    struct sockaddr_in sendsock;
    struct sockaddr_in recvsock;
    int sockfd = 0;
    socklen_t socklen = 0;
    char buf[MAXLINE];
    char ipstr[INET_ADDRSTRLEN];
    int ret, i;

    char *sendmsg = NULL;
    uint16_t dstport = 0;
    char *dstip = NULL;

    uint8_t recv_enable = FALSE;
    uint8_t tcp_or_udp = UDP_ENABLE;

    for (i = 0; i < argc; i++)
    {
    if (strcmp(argv[i], "-i") == 0)
    dstip = argv[i+1];
    else if (strcmp(argv[i], "-p") == 0)
    dstport = atoi(argv[i+1]);
    else if (strcmp(argv[i], "-s") == 0)
    sendmsg = argv[i+1];
    else if (strcmp(argv[i], "-r") == 0)
    recv_enable = TRUE;
    else if (strcmp(argv[i], "-t") == 0)
    tcp_or_udp = TCP_ENABLE;
    else if (strcmp(argv[i], "-h") == 0)
    {
    fprintf(stderr, "./a.out -i [ip] -p [port] -s [message] -r -[t|u]\n");
    exit(0);
    }
    else
    continue;
    }

    if (dstip == NULL || dstport == 0)
    exit(EXIT_FAILURE);

    socklen = sizeof(struct sockaddr);
    memset(&sendsock, 0, sizeof(sendsock) );

    if (tcp_or_udp == TCP_ENABLE)
    {
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    ret = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&ret, sizeof(int));
    ret = bind(sockfd, (struct sockaddr *)&sendsock, sizeof(sendsock) );
    if (ret == -1)
    perror("tcp bind err");

    sendsock.sin_family = AF_INET;
    inet_pton(AF_INET, dstip, &sendsock.sin_addr);
    sendsock.sin_port = htons(dstport);
    ret = connect(sockfd, (struct sockaddr *)&sendsock, sizeof(sendsock) );
    if (ret == -1)
    perror("tcp connect err");

    ret = send(sockfd, sendmsg, strlen(sendmsg) + 1, 0);
    if (ret == -1)
    perror("tcp send err");
    else
    fprintf(stderr, "Client Send \"%s\" To %s:%u\n", sendmsg,
    inet_ntop(AF_INET, &sendsock.sin_addr, ipstr, sizeof(ipstr) ),
    ntohs(sendsock.sin_port) );

    if (recv_enable == TRUE)
    {
    ret = recv(sockfd, buf, MAXLINE, 0);
    if (-1 == ret)
    {
    perror("recv err");
    close(sockfd);
    exit(1);
    }
    buf[ret] = 0;

    printf("Client Recv \"%s\" From %s:%u\n", buf,
    inet_ntop(AF_INET, &recvsock.sin_addr, ipstr, sizeof(ipstr) ),
    ntohs(recvsock.sin_port) );
    }

    close(sockfd);
    exit(0);
    }
    else
    {
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sockfd)
    {
    perror("create socket error");
    exit(1);
    }

    sendsock.sin_family = AF_INET;
    inet_pton(AF_INET, dstip, &sendsock.sin_addr);
    sendsock.sin_port = htons(dstport);

    // send data to server
    ret = sendto(sockfd, sendmsg, strlen(sendmsg) + 1, 0,
    (struct sockaddr *)&sendsock, sizeof(sendsock) );
    if (-1 == ret)
    {
    close(sockfd);
    perror("call sendto error");
    exit(1);
    }
    else
    {
    fprintf(stderr, "Client Send \"%s\" To %s:%u\n", sendmsg,
    inet_ntop(AF_INET, &sendsock.sin_addr, ipstr, sizeof(ipstr) ),
    ntohs(sendsock.sin_port) );
    }

    // recieve data from server
    if (recv_enable == TRUE)
    {
    ret = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr *)&recvsock,
    &socklen);
    if (-1 == ret)
    {
    perror("call recvfrom error");
    close(sockfd);
    exit(1);
    }
    buf[ret] = 0;

    printf("Client Recv \"%s\" From %s:%u\n", buf,
    inet_ntop(AF_INET, &recvsock.sin_addr, ipstr, sizeof(ipstr) ),
    ntohs(recvsock.sin_port) );
    }

    close(sockfd);
    exit(0);
    }

    return 0;
    }

  • 相关阅读:
    hibernate理解
    struts理解
    网上书城项目
    编码过程中遇到的问题
    JS回调函数
    requirejs 一个拆分js项目的类库
    jq插件开发总结
    转载-- 魔兽哈希算法封装和测试
    转载--C# PLINQ 内存列表查询优化历程
    Oracle删除死锁进程的方法
  • 原文地址:https://www.cnblogs.com/tiantao/p/2398580.html
Copyright © 2011-2022 走看看