Unix c 网络编程 UDP

来源:互联网 发布:网络拓扑图图片 编辑:程序博客网 时间:2024/05/22 07:09
服务器端:
===============================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <netdb.h>
#include <memory.h>
#include <time.h>


int sockfd;


void out_addr(struct sockaddr_in addr)
{
        char ip[16];
        unsigned short port = ntohs(addr.sin_port);
    inet_ntop(AF_INET, &addr.sin_addr.s_addr,
                        ip, sizeof(addr));
    printf("ip:%s(%u) connect...\n",ip, port);
}


void do_service(struct sockaddr_in addr)
{
    long t = time(0);
        char* s = ctime(&t);
        if(sendto(sockfd, s, strlen(s), 0, 
                        (struct sockaddr*)&addr,sizeof(addr))<0)
        {
                fprintf(stderr, "sendto:%s\n",strerror(errno));
                return;
        }
}


int main(int argc, char*argv[])
{
        if(argc < 2){
                fprintf(stderr, "usage: %s port\n",
                                strerror(errno));
                exit(1);
        }
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sockfd < 0){
                fprintf(stderr, "socket:%s\n",
                                strerror(errno));
                exit(1);
        }


        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(atoi(argv[1]));
        addr.sin_addr.s_addr = INADDR_ANY;


        if(bind(sockfd, (struct sockaddr*)&addr, 
                                sizeof(addr)) < 0){
                fprintf(stderr, "bind:%s\n",strerror(errno));
                exit(1);
        }


    char buffer[512];
        memset(buffer, 0, 512);
        struct sockaddr_in caddr;
        int  len = sizeof(caddr);
    while(1){
                if(recvfrom(sockfd, buffer, sizeof(buffer),
                  0, (struct sockaddr*)&caddr, &len)<0){
                        fprintf(stderr, "recvform:%s\n",
                                        strerror(errno));
                        continue;
                }
                do_service(caddr);
        out_addr(caddr);
        }




        return 0;
}
===============================================================================================


客户端:
===============================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <memory.h>
#include <unistd.h>
#include <fcntl.h>


int sockfd;
int main(int argc, char*argv[])
{
        if(argc < 3){
                fprintf(stderr, "usage:%s ip port\n",
                                strerror(errno));
                exit(1);
        }
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sockfd < 0){
                fprintf(stderr, "socket:%s\n",strerror(errno));
                exit(1);
        }


        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET, argv[1], 
                        &addr.sin_addr.s_addr);




    char buffer[512];
        sendto(sockfd, buffer, sizeof(buffer),
                        0, (struct sockaddr*)&addr, sizeof(addr));


        memset(buffer, 0, sizeof(buffer));
    ssize_t n;
    if((n=recv(sockfd, buffer, sizeof(buffer), 0))< 0)
    {
        fprintf(stderr, "recv:%s\n", strerror(errno));
        close(sockfd);
        exit(1);
    }else
    {
        if(write(STDOUT_FILENO, buffer, n)!=n)
        {
            fprintf(stderr, "write:%s\n",
                    strerror(errno));
            close(sockfd);
            exit(1);
        }
    }
    close(sockfd);
}
0 0
原创粉丝点击