UDP发送与接受小软件的程序实现

来源:互联网 发布:api原油库存数据下载 编辑:程序博客网 时间:2024/06/05 23:54

网上有很多c实现的udp发送和接收的控制台小程序,可以同时发送和接收udp包并在标准输出打印。由于工作需要自己写了一个实现的小程序。可以绑定本地端口号向远程主机发送udp包。同时可以接受任意主机发送来的udp包。在UBUNTU 16.4上亲测有效。程序中将ip地址和端口号用宏来写,需要改一次ip和端口号就编译一次。当然也可以设计成利用argc和argv命令行传参的形式。


#include <sys/types.h>

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

#define UDP_TEST_PORT8080/*我的远程主机端口号*/
#define UDP_TEST_PORT_CLIENT60010/*我的本地端口号*/
#define UDP_SERVER_IP "10.10.10.207"/*我的远程主机ip*/
#define UDP_SERVER_IP_CLIENT "10.10.10.202" /*我的本地ip*/

/*新线程接受udp包*/
void *msg_recv(void * arg)

{

        char buffer1[256];

        while(1) {
                bzero(buffer1, sizeof(buffer1));
                /* 接收远程主机返回的字符串*/
                recvfrom(sockfd, buffer1, sizeof(buffer1), 0, (struct sockaddr *)&addr, &addr_len);

                printf("Received a string from  %s : port%d, string is: %s\n", inet_ntoa(addr.sin_addr), 

                        ntohs(addr.sin_port),buffer1);

        }
        return (void *)0;
}

int main(int argc, char* argv[])
{
        struct sockaddr_in addrclient;
        int len = 0;
        char buffer[256];
        pthread_t recvid;

        /* 建立socket,注意必须是SOCK_DGRAM */
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                perror("socket");
                exit(1);
        }

        /* 填写sockaddr_in*/
        bzero(&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(UDP_TEST_PORT);
        addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);

        /* 填写sockaddr_in*/
        bzero(&addrclient, sizeof(addrclient));
        addrclient.sin_family = AF_INET;
        addrclient.sin_port = htons(UDP_TEST_PORT_CLIENT);
        addrclient.sin_addr.s_addr = inet_addr(UDP_SERVER_IP_CLIENT);

        /*绑定本地ip和端口*/
        if (bind(sockfd, (struct sockaddr *)&addrclient, sizeof(addrclient))<0) {
                perror("connect");
                exit(1);
        }

        /*抛出新线程用于接受udp包*/
        if (pthread_create(&recvid, NULL, (void *)msg_recv, NULL) != 0){
                printf("Pthread_create for receiving message error!\n");
                return -1;
        }

        while(1) {
                bzero(buffer, sizeof(buffer));
                printf("Please enter a string to send to server: \n");
                /* 从标准输入设备取得字符串*/
                len = read(STDIN_FILENO, buffer, sizeof(buffer));
                /* 将字符串传送远程主机端*/
                sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);
        }
        pthread_join(recvid, NULL);
        return 0;
}


// ----------------------------------------------------------------------------
// End of myudp_assist.c
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 沉甸甸拼音 沉甸甸的 沉甸甸照样子写词语 沉着地什么填空 沉睡反义词 沉睡的维纳斯 沉睡者 沉睡谷 沉睡谷第二季 绝世仙芒 星海沉砂 沉积 沉积岩系 化学沉积 沉积岩有 沉积岩有哪些 黑色素沉积的原因 色素沉积是怎么回事 沉积岩有哪些岩石 什么叫沉积岩 黑色素沉积斑 黑色素沉积怎么去除 怎样去除脸上的色素沉积 神经退行性疾病伴脑铁沉积 沉积岩的主要类型 沉积岩 英语 石灰岩 沉积岩 沉积岩的形成过程 沉积物 公子无色 沉筱之 龙凤 沉筱之 恰逢雨连天 沉筱之 沉箱 沉可以组什么词 沉的组词 沉字组词 沉怎么组词 沉的组词有那些 沉的组词是什么 沉字的组词 褪组词 沉组词有哪些