您的位置:首页 > 理论基础 > 计算机网络

linux网络编程代码

2017-11-02 15:26 267 查看
UDP

收UDP

#include <sys/types.h>

#include <sys/socket.h>

#include<pthread.h>

#include <netinet/in.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <stdlib.h>

int main(int argc, char **argv)

{

    if (argc != 2)

    {

        printf("Usage: %s port\n", argv[0]);

        exit(1);

    }

    printf("Welcome! This is a UDP server, I can only received message from client and reply with same message\n");

    

    struct sockaddr_in addr;

    addr.sin_family = AF_INET;

    addr.sin_port = htons(atoi(argv[1]));

    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    int sock;

    if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

    {

        perror("socket");

        exit(1);

    }

    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)

    {

        perror("bind");

        exit(1);

    }

    char buff[512];

    struct sockaddr_in clientAddr;

    int n;

    int len = sizeof(clientAddr);

    while (1)

    {

        n = recvfrom(sock, buff, 511, 0, (struct sockaddr*)&clientAddr, &len);

        if (n>0)

        {

            buff
= 0;

            printf("%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff);

            n = sendto(sock, buff, n, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));

            if (n < 0)

            {

                perror("sendto");

                break;

            }

        }

        else

        {

            perror("recv");

            break;

        }

    }

    return 0;

}

发UDP

#include <sys/types.h>

#include <sys/socket.h>

#include<pthread.h>

#include <netinet/in.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <stdlib.h>

int main(int argc, char **argv)

{

    if (argc != 3)

    {

        printf("Usage: %s ip port", argv[0]);

        exit(1);

    }

    printf("This is a UDP client\n");

    struct sockaddr_in addr;

    int sock;

    if ( (sock=socket(AF_INET, SOCK_DGRAM, 0)) <0)

    {

        perror("socket");

        exit(1);

    }

    addr.sin_family = AF_INET;

    addr.sin_port = htons(atoi(argv[2]));

    addr.sin_addr.s_addr = inet_addr(argv[1]);

    if (addr.sin_addr.s_addr == INADDR_NONE)

    {

        printf("Incorrect ip address!");

        close(sock);

        exit(1);

    }

    char buff[512];

    int len = sizeof(addr);

    while (1)

    {

        gets(buff);

        int n;

        n = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&addr, sizeof(addr));

        if (n < 0)

        {

            perror("sendto");

            close(sock);

            break;

        }

        n = recvfrom(sock, buff, 512, 0, (struct sockaddr *)&addr, &len);

        if (n>0)

        {

            buff
= 0;

            printf("received:");

            puts(buff);

        }

        else if (n==0)

        {

            printf("server closed\n");

            close(sock);

            break;

        }

        else if (n == -1)

        {

            perror("recvfrom");

            close(sock);

            break;

        }

    }

    

    return 0;

}

组播

   收组播流

   #include <stdio.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #include <string.h>

    #include <arpa/inet.h>

    #define MAXBUF 1500

    //#define PUERTO 8001

    //#define GRUPO "238.123.46.66"

     int main(int argc, char *argv[]){

            for(int i = 0;i<argc;i++){

                    printf("%s\n", argv[i]);

                }

                

        int port = atoi(argv[3]);

        int fd, n, r;

        struct sockaddr_in srv, cli;

        struct ip_mreq mreq;

        char buf[MAXBUF];

        memset( &srv, 0, sizeof(struct sockaddr_in) );

        memset( &cli, 0, sizeof(struct sockaddr_in) );

        memset( &mreq, 0, sizeof(struct ip_mreq) );

        srv.sin_family = AF_INET;

        srv.sin_port = htons(port);

        if( inet_aton(argv[2], &srv.sin_addr ) < 0 ) {

                perror("inet_aton");

                return -1;

        }

        if( (fd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) < 0 ){

            perror("socket");

            return -1;

        }

        if( bind(fd, (struct sockaddr *)&srv, sizeof(srv)) < 0 ){

            perror("bind");

            return -1;

        }

        if (inet_aton(argv[2], &mreq.imr_multiaddr) < 0) {

            perror("inet_aton");

            return -1;

        }

        inet_aton( argv[1], &(mreq.imr_interface) );

        if( setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(mreq)) < 0 ){

            perror("setsockopt");

            return -1;

        }

        n = sizeof(cli);

        while(1){

                                

            if( (r = recvfrom(fd, buf, MAXBUF, 0, (struct sockaddr *)&cli, (socklen_t*)&n)) < 0 ){

                perror("recvfrom");

            }else{

                          printf("recv:%d\n",r);

                buf[r] = 0;

                FILE*fp  =fopen("/home/1.ts","ab");

                if(fp!=NULL){

                    fwrite(buf,1, r,fp);

                    fclose(fp);

                }

                //fprintf(stdout, "Mensaje desde %s: %s", inet_ntoa(cli.sin_addr), buf);

            }

        }

    }
用法:./testudp   192.168.200.105 238.123.46.66 8001

发组播流

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define PORT 10086

#define SIZE 128

int main(void)

{

    int ret = -1;

    int sockfd = -1;

    int i = 0;

    char buf[SIZE];

    struct sockaddr_in peer;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (-1 == sockfd)

    {

        perror("socket");

        goto err0;

    }

    memset(&peer, 0, sizeof(peer));

    peer.sin_family = AF_INET;

    peer.sin_port = htons(PORT);

    inet_pton(AF_INET, "224.0.0.88", &peer.sin_addr);

    printf("send data to UDP Server %s: %d\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));

    //向多播组发送消息

    while(1)

    {

        sprintf(buf, "hello world %d", i);

        ret = sendto(sockfd, buf, strlen(buf), 0, (void*)&peer, sizeof(peer));

        printf("ret: %d\n", ret);

        sleep(1);

        i++;

    }

    return 0;

err0:

    return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: