加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

tcp -udp 网络测试程序

(2011-01-13 17:49:56)
标签:

杂谈

分类: linux
tcp 测试程序
#test.sh
#!/bin/sh
ls *.h *.c *.cpp  | awk '{print $1}' > file_total
cat file_total| while read file
do
echo " " >> $file
  echo $file
  cat $file | tr -d "\r" > tempfile_$$_
  mv tempfile_$$_ $file
done
rm file_total *~
chmod +x *.h *.cpp
g++ -g -Wall async-server.cpp -o server
g++ -g -Wall client.cpp -o client

//async-server.cpp
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXBUF 1024

char szIP[255];
int main(int argc, char **argv)
{
    int sockfd, new_fd;
    socklen_t len;
    struct sockaddr_in my_addr, their_addr;
    unsigned int myport, lisnum;
    char buf[MAXBUF + 1];
    fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;

    if (argv[1])
        myport = atoi(argv[1]);
    else
        myport = 7838;

    if (argv[2])
        lisnum = atoi(argv[2]);
    else
        lisnum = 2;
    printf("useage : %s port listennum ip\n",argv[0]);
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(myport);
    if (argv[3])
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);
    else
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
   char * some_addr = inet_ntoa((struct in_addr)my_addr.sin_addr); 
   strcpy(szIP, some_addr);
    if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
            == -1)
    {
        perror("bind");
        exit(1);
    }

    if (listen(sockfd, lisnum) == -1)
    {
        perror("listen");
        exit(1);
    }

    printf("%s listen %s port %d \n",argv[0],szIP,myport);
    while (1)
    {
        printf
        ("\n----wait for new connection for chat....\n");
        len = sizeof(struct sockaddr);
        if ((new_fd =
                    accept(sockfd, (struct sockaddr *) &their_addr,
                           &len)) == -1)
        {
            perror("accept");
            exit(errno);
        }
        else
            printf("server: got connection from %s, port %d, socket %d\n",
                   inet_ntoa(their_addr.sin_addr),
                   ntohs(their_addr.sin_port), new_fd);

       
        printf("\n ready,begin chat...,press enter to send message to peer\n");
        while (1)
        {
           
            FD_ZERO(&rfds);
           
            FD_SET(0, &rfds);
            maxfd = 0;
           
            FD_SET(new_fd, &rfds);
            if (new_fd > maxfd)
                maxfd = new_fd;
           
            tv.tv_sec = 1;
            tv.tv_usec = 0;
           
            retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
            if (retval == -1)
            {
                printf("will exit,select error %s", strerror(errno));
                break;
            }
            else if (retval == 0)
            {
               
                continue;
            }
            else
            {
                if (FD_ISSET(0, &rfds))
                {
                   
                    bzero(buf, MAXBUF + 1);
                    fgets(buf, MAXBUF, stdin);
                    if (!strncasecmp(buf, "quit", 4))
                    {
                        printf("self request to quit!\n");
                        break;
                    }
                    len = send(new_fd, buf, strlen(buf) - 1, 0);
                    if (len > 0)
                        printf
                        ("message: %s\tsend success, total %d bytes!\n",
                         buf, len);
                    else
                    {
                        printf
                        ("message: '%s' send failed, error code %d, error message '%s'\n",
                         buf, errno, strerror(errno));
                        break;
                    }
                }
                if (FD_ISSET(new_fd, &rfds))
                {
                   
                    bzero(buf, MAXBUF + 1);
                   
                    len = recv(new_fd, buf, MAXBUF, 0);
                    if (len > 0)
                        printf
                        ("receive message :'%s', total %d  bytes\n",
                         buf, len);
                    else
                    {
                        if (len < 0)
                            printf
                            ("receive message failed! error code %d, error message '%s'\n",
                             errno, strerror(errno));
                        else
                            printf("peer quit,chat stop\n");
                        break;
                    }
                }
            }
        }
        close(new_fd);
       
        printf("still chat?(no->quit)");
        fflush(stdout);
        bzero(buf, MAXBUF + 1);
        fgets(buf, MAXBUF, stdin);
        if (!strncasecmp(buf, "no", 2))
        {
            printf("stop chat!\n");
            break;
        }
    }

    close(sockfd);
    return 0;
}

//client.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define MAXBUF 1024
int main(int argc, char **argv)
{
    int sockfd, len;
    struct sockaddr_in dest;
    char buffer[MAXBUF + 1];
    fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;

    if (argc != 3)
    {
        printf
        ("参数格式错误!正确用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息 \n",
         argv[0], argv[0]);
        exit(0);
    }
   
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("Socket");
        exit(errno);
    }

   
    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(atoi(argv[2]));
    if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0)
    {
        perror(argv[1]);
        exit(errno);
    }

   
    if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0)
    {
        perror("Connect ");
        exit(errno);
    }

    printf
    ("\n准备就绪,可以开始聊天了……直接输入消息回车即可发信息给对方\n");
    while (1)
    {
       
        FD_ZERO(&rfds);
       
        FD_SET(0, &rfds);
        maxfd = 0;
       
        FD_SET(sockfd, &rfds);
        if (sockfd > maxfd)
            maxfd = sockfd;
       
        tv.tv_sec = 1;
        tv.tv_usec = 0;
       
        retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
        if (retval == -1)
        {
            printf("将退出,select出错! %s", strerror(errno));
            break;
        }
        else if (retval == 0)
        {
           
            continue;
        }
        else
        {
            if (FD_ISSET(sockfd, &rfds))
            {
               
                bzero(buffer, MAXBUF + 1);
               
                len = recv(sockfd, buffer, MAXBUF, 0);
                if (len > 0)
                    printf
                    ("接收消息成功:'%s',共%d个字节的数据\n",
                     buffer, len);
                else
                {
                    if (len < 0)
                        printf
                        ("消息接收失败!错误代码是%d,错误信息是'%s'\n",
                         errno, strerror(errno));
                    else
                        printf("对方退出了,聊天终止!\n");
                    break;
                }
            }
            if (FD_ISSET(0, &rfds))
            {
               
                bzero(buffer, MAXBUF + 1);
                fgets(buffer, MAXBUF, stdin);
                if (!strncasecmp(buffer, "quit", 4))
                {
                    printf("自己请求终止聊天!\n");
                    break;
                }
               
                len = send(sockfd, buffer, strlen(buffer) - 1, 0);
                if (len < 0)
                {
                    printf
                    ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n",
                     buffer, errno, strerror(errno));
                    break;
                }
                else
                    printf
                    ("消息:%s\t发送成功,共发送了%d个字节!\n",
                     buffer, len);
            }
        }
    }
   
    close(sockfd);
    return 0;
}


UDP测试程序
//server.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
//deepfuture.javaeye.com

int main(void)
{
    int fd;
    int addresslen;
    struct sockaddr_in address;//地址信息结构

    int rc;



    //建立socket
    fd=socket(AF_INET,SOCK_DGRAM,0);//fd为socket
    if (fd==-1) //错误,类型从errno获得
    {
        perror("error");//perror先输出参数,后跟":"加空格,然后是errno值对应的错误信息(不是错误代码),最后是一个换行符。
    }

    //bind 到socket fd
    address.sin_family=AF_INET;//IPV4协议,AF_INET6是IPV6
    address.sin_addr.s_addr=htonl(INADDR_ANY);//l表示32位,htonl能保证在不同CPU的相同字节序
    address.sin_port=htons(1253);//端口号,s表示16位
    addresslen=sizeof(address);


    bind(fd,(struct sockaddr *)&address,addresslen);//bind


    while (1)
    {

        struct sockaddr_in clientaddress;
        int address_len;

        char mybuf[100];
        char *buf="hello\n";
        int n;


        printf("server wait....\n");
        fflush(stdout);
        address_len=sizeof(clientaddress);
        n=recvfrom(fd,mybuf,100,0,(struct sockaddr *)&clientaddress,(socklen_t*)&address_len);//读数据
        printf("server read :%s\n",mybuf);
        sendto(fd,buf,strlen(buf)+1,0,(struct sockaddr *)&clientaddress,address_len);//写数据
        printf("server send :%s\n",buf);

    }
}



//client.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
//deepfuture.javaeye.com

int main(void)
{
    int fd;
    int addresslen;
    struct sockaddr_in address;//地址信息结构

    int rc;

    char mybuf[100];
    char *buf="deepfuture.javaeye.com\n";
    int n;



    //建立socket
    fd=socket(AF_INET,SOCK_DGRAM,0);//fd为socket
    if (fd==-1) //错误,类型从errno获得
    {
        perror("error");//perror先输出参数,后跟":"加空格,然后是errno值对应的错误信息(不是错误代码),最后是一个换行符。
    }

    //bind 到socket fd
    address.sin_family=AF_INET;//IPV4协议,AF_INET6是IPV6
    address.sin_addr.s_addr=htonl(INADDR_ANY);//l表示32位,htonl能保证在不同CPU的相同字节序
    address.sin_port=htons(1253);//端口号,s表示16位
    addresslen=sizeof(address);





    printf("client send....\n");
    fflush(stdout);
    sendto(fd,buf,strlen(buf)+1,0,(struct sockaddr *)&address,addresslen);//写数据
    printf("client send :%s\n",buf);
    n=recvfrom(fd,mybuf,100,0,NULL,NULL);//读数据
    printf("client read :%s\n",mybuf);



}

TCP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),者read()和write();
7、关闭网络连接;
8、关闭监听;

TCP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;


与之对应的UDP编程步骤要简单许多,分别如下:

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;


UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;

附: socket是基本,其他地址,端口信息都是属性信息,绑定到socket上的.



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有