2-24 UDP网络程序设计

(本节笔记的实验代码,在这里

1.  UDP编程模型函数化

    1.1  server端函数
        创建socket——>socket();
        绑定地址   ——>bind();
        接收数据   ——>recvfrom();
        发送数据   ——>sendto();
        结束连接   ——>close();
    1.2  client端函数
        创建socket——> socket();
        接收数据   ——>recvfrom();
        发送数据   ——>sendto();
        结束连接   ——>close();

2.  函数学习
    2.1接收数据
        函数名:
                recvfrom
        函数原型: man recvfrom
                ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct_sockaddr *src_addr, socklen_t *addrlen);
        函数功能:
                控制如何接收数据。
        所属头文件:
                <sys/types.h> <sys/socket.h>
        返回值:
                成功 :返回接收数据的大小         失败 :返回-1
        参数说明:
                 sockfd : server端套接字ID。
                *buf :接收的数据存放的地址。
                len :接收的数据大小。
                flags :标志位,如果不需要设置可以直接设为0。
                *src_addr : 一个struct sockaddr结构的指针,里面存有发送方的地址。 //一般用法为(struct sockaddr *)(&struct sockaddr_in)
                *addrlen :发送方地址长度(变量)的地址。

    2.2发送数据
        函数名:
                sendto
        函数原型: man sendto
                ssize_t send(int sockfd, const void *buf, size_t len, int flags, struct_sockaddr *src_addr, socklen_t *addrlen);
        函数功能:
                控制如何发送数据。
        所属头文件:
                <sys/types.h>         <sys/socket.h>
        返回值:
                成功 :返回发送数据的大小         失败 :返回-1
        参数说明:
                sockfd : client端套接字ID。
                *buf :发送的数据存放的地址。
                len :发送的数据大小。
                flags :标志位,如果不需要设置可以直接设为0。
                *src_addr : 一个struct sockaddr结构的指针,里面存有接收方的地址。 //一般用法为(struct sockaddr *)(&struct sockaddr_in)
                addrlen :接收方地址长度。

3.  综合实例
/*  touch server.c  */

/* 利用UDP协议进行网络通讯的服务器端程序 */


#include <stdio.h>

#include <sys/socket.h>

#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>

#define PORTNUM 3333


int main()
{
int sockfd;
int recv_sz;
long addr_len;
char buff[128];
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
/* 1.创建socket */
if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0)))
{
printf("create socket error!\n");
exit(1);
}
/* 2.绑定地址 */
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORTNUM);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));
while(1)
{
addr_len = sizeof(struct sockaddr);

/* 3.接收数据 */
bzero(buff, sizeof(buff));
recv_sz = recvfrom(app_sockfd, buff, 128, 0, (struct sockaddr *)(&client_addr), sizeof(struct sockaddr) , (socklen_t *)(&addr_len) );
printf("server get connection from:%s\n", inet_ntoa(client_addr.sin_addr));
buffer[recv_sz] = '\0';
printf("server received %s\n", buff);
}
/* 4.结束连接 */
close(sockfd);
return 0;
}
                                                                  

/*  touch client.c  */

/* 利用UDP协议进行网络通讯的客户端程序 */


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

#define PORTNUM 3333

int main(int argc, char **argv)
{
int sockfd;
int send_sz;
char buff[128];
struct sockaddr_in server_addr;

if(argc != 2)
{
printf("Usage: %s server_ip\n", argv[0]);
exit(1);
}

/* 1.创建socket */
if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0)))
{
printf("create socket error!\n");
exit(1);
}
/* 2.连接服务器 */
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORTNUM);
inet_aton(argv[1], &server_addr.sin_addr.s_addr);
/* 3.发送数据 */
printf("Please input something:\n");
fgets(buff, 128, stdin);
sendto(sockfd, buffe, strlen(buffer), 0, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));
/* 5.结束连接 */
close(sockfd);
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值