网络编程套接字(3)——简单的UDP网络程序

  • UDP服务器
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<stdlib.h>

void service(int sock){
    char buf[128];
    struct sockaddr_in client;
    socklen_t len=sizeof(client);
    while(1){
        ssize_t s = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
        if(s > 0){
            buf[s]=0;
            printf("[%s:%d]:%s\n",inet_ntoa(client.sin_addr));
        }
    }
}

int main(int argc,char* argv[]){
    if(argc != 3){
        printf("Usage:%s [ip] [port]\n",argv[0]);
        return 3;
    }
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket");
        return 1;
    }
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr = inet_addr(argv[1]);

    if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
        perror("bind");
        return 2;
    }
    service(sock);
}


  • UDP客户端
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char* argv[]){
    if(argc != 3){
        printf("Usage:%s [ip] [port]\n",argv[0]);
        return 3;
    }
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket");
        return 2;
    }
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = inet_addr(argv[1]);

    char buf[128];
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);
    while(1){
        buf[0] = 0;
        ssize_t s = read(0,buf,sizeof(buf)-1);
        if(s > 0){
            buf[s-1] = 0;
            sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,sizeof(server));
            ssize_t _s = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&len);
            if(_s > 0){
                buf[_s] = 0;
                printf("server echo# %s\n",buf);
            }
        }
    }
}

  • 相关函数简介

1.socket函数


        功能:用来创建一个能够进行网络通信的套接字。

        相关参数:

                domain:指定应用程序使用的通信协议的协议族。通常为PF_INET/AF_INET,表示互联网协议族(TCP/IP协议族)。

            type:指定要创建的套接字类型。流套接字类型为SOCK_STREAM;数据报套接字类型为SOCK_DGEAM。

                  Protocol:指定应用程序所使用的通信协议,通常为0。

        返回值:成功返回新创建的套接字的描述符;失败返回-1。


2. bind函数        

 

        功能:当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。

        相关参数:

                sockfd:指定待绑定的socket描述符。

                addr:指定一个sockaddr结构,结构定义我们在网络编程套接字(2)这篇博客中已经介绍过,这里不再赘述。

                addrlen:结构体的大小。

        返回值:成功返回0,;失败返回-1。


3.recvfrom函数


        功能:接收一个数据报并保存源地址。

        相关参数:

                sockfd:表示一个已连接套接口的描述字。

                buf:接收数据缓冲区。

                len:缓冲区长度。

                flags:调用操作方式,通常为0。

                src_addr:指向装有源地址的缓冲区。

                addrlen:指向缓冲区的长度值。

        返回值:成功返回读入的字节数;失败返回-1。


4.sendto函数


        功能:将数据由指定的socket传给对方主机。

        相关参数:

                sockfd:索引将要从其发送数据的套接字。

                buf:指向将要发送数据的缓冲区。

                len:将要发送数据的缓冲区长度。

                flags:调用操作方式,通常为0。

                dest_addr:指向存放接收端地址的区域。

                addrlen:指向存放接收端地址的区域的长度值。

        返回值:成功返回实际传送出去的字符数;失败返回-1。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值