/*********************程序相关信息*********************
* 程序编号:014
* 程序编写起始日期:2013.11.29
* 程序编写完成日期:2013.11.29
* 程序修改日期: 修改备注:
* 程序目的:学习linux UDP( DGRAM)
* 所用主要函数:socket() bind() recvfrom() sendto()
* 程序说明:
* 程序完成地点:
* *********************程序相关信息*********************/
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h> #include <stdio.h> #define BUFSIZE 1500 int main(void)
{
int sd;
struct sockaddr_in myend, hisend;
socklen_t hislen;
int ret;
char buf[BUFSIZE]; sd = socket(PF_INET, SOCK_DGRAM, 0);
if (sd == -1) {
perror("socket()");
goto socket_err;
}
//int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
//sockfd:是由socket调用返回的文件描述符.
//addrlen:是sockaddr结构的长度.
//my_addr:是一个指向sockaddr的指针. 在<linux/socket.h>中有 sockaddr的定义
//struct sockaddr{
//unisgned short as_family;
//char sa_data[14];
//};
//不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sock
//addr_in) 来代替.在<linux/in.h>中有sockaddr_in的定义
//struct sockaddr_in{
//unsigned short sin_family;
//unsigned short int sin_port;
//struct in_addr sin_addr;
//unsigned char sin_zero[8];
//我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表
//示可以 和任何的主机通信,sin_port是我们要监听的端口号.sin_zero[8]是用来填充的
//.. bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和
//socket一样
myend.sin_family = AF_INET;
myend.sin_port = htons(8899);
//i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反. 为了统一起来,在Li
//nux下面,有专门的字节转换函数.
//unsigned long int htonl(unsigned long int hostlong)
//unsigned short int htons(unisgned short int hostshort)
//unsigned long int ntohl(unsigned long int netlong)
//unsigned short int ntohs(unsigned short int netshort)
//在这四个转换函数中,h 代表host, n 代表 network.s 代表short l 代表long 第一个函
//数的意义是将本机器上的long数据转化为网络上的long. 其他几个函数的意义也差不多
//
myend.sin_addr.s_addr = INADDR_ANY; // man 7 ip
ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend));
if (ret == -1) {
perror("bind()");
goto bind_err;
} hislen = sizeof(hisend);//??
while (1) {
//int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct socka
//ddr * from int *fromlen)
//int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct s
//ockaddr *to int tolen)
//sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发送或接收的缓冲区
//及大小.recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息
//来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL.sendto负责
//向to发送信息.此时在to里面存储了收信息方的详细资料.
ret = recvfrom(sd, buf, BUFSIZE, 0, (struct sockaddr *)&hisend, &hislen);
/* if error */ write(1, buf, ret); sendto(sd, "xxxxxx\n", 7, 0, (struct sockaddr *)&hisend, hislen);
} close(sd); return 0; bind_err:
close(sd);
socket_err:
return 1;
}
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h> #include <stdio.h> #define BUFSIZE 1500 int main(void)
{
int sd;
struct sockaddr_in myend, hisend;
socklen_t hislen;
int ret;
char buf[BUFSIZE]; sd = socket(PF_INET, SOCK_DGRAM, 0);
if (sd == -1) {
perror("socket()");
goto socket_err;
} hisend.sin_family = AF_INET;
hisend.sin_port = htons(8899);
// int inet_pton(int af, const char *src, void *dst); inet_pton(AF_INET, "192.168.1.111", &hisend.sin_addr);
// This function converts the character string src into a network address
// structure in the af address family, then copies the network address
//structure to dst.
//
#if 0
ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend));
if (ret == -1) {
perror("bind()");
goto bind_err;
}
#endif hislen = sizeof(hisend);
while (1) {
ret = read(0, buf, BUFSIZE);
/* if error */
if (ret == 0) {
break;
}
// ssize_t sendto(int s, const void *buf, size_t len, int flags, const
//struct sockaddr *to, socklen_t tolen);
//Send, sendto, 和 sendmsg 用于向另一个套接字传递消息. Send 仅仅用于连接套接字,而 sendto 和 sendmsg
//可用于任何情况下.
//
//目标地址用 to 指定, tolen 定义其长度.消息的长度用 len 指定.
//如果消息太长不能通过下层协议,函数将返回 EMSGSIZE 错误,消息也不会被送出.
sendto(sd, buf, ret, 0, (struct sockaddr *)&hisend, hislen);
//ssize_t recvfrom(int s, void *buf, size_t len, int flags,
// struct sockaddr *from, socklen_t *fromlen)
ret = recvfrom(sd, buf, BUFSIZE, 0, (struct sockaddr *)&hisend, &hislen);
/* if error */ write(1, buf, ret);
} close(sd); return 0; bind_err:
close(sd);
socket_err:
return 1;
}

UDP套接字——(DGRAM)的更多相关文章

  1. python UDP套接字通信

    UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...

  2. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  3. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  4. 【转】 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  5. 【nodejs】创建udp套接字的类型参数的含义

    nodejs在创建udp套接字的时候,需要传入一个类型参数.有两种类型参数可供选择:udp4和udp6.udp4对应的就是ipv4,udp6对应的是ipv6.

  6. JavaTCP和UDP套接字编程

    在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...

  7. 计算机网络实验 UDP套接字编程

    这是个傻瓜式操作教程 西科大计算机网络实验 UDP套接字编程 我用自己的Ubuntu16.04来举例,实验室的是虚拟机,差不多 只针对第三个题目,修改服务器来通过响应客户端发送的GetTime并发送给 ...

  8. UDP套接字编程 返回系统时间

    计算机网络实验 简单UDP套接字编程 这是学校老师自己改进了一点的题目.我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西! 我的任务是做客户端和 ...

  9. Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  10. <unix网络编程>UDP套接字编程

    典型的UDP客户/服务器程序的函数调用如下: 1.缓冲区 发送缓冲区用虚线表示,任何UDP套接字都有发送缓冲区,不过该缓冲区仅能表示写到该套接字的UDP数据报的上限.如果应用进程写一个大于套接字缓冲区 ...

随机推荐

  1. JavaScript学习之事件原理和实践

    1 基本概念 1.1 事件 JavaScript与HTML之间的交互是通过事件实现的. 事件是文档或浏览器窗口中发生的一些特定的交互瞬间,在事件上可以注册处理程序,以便当事件发生时,处理程序中的代码得 ...

  2. chrome浏览器使用HTML5预览图片

    chrome浏览器对HTML5支持的较好,使用HTML5的File相关的api,可以实现前台页面在选定图片后,不上传即可预览.代码如下: 1.前台代码,使用<input type="f ...

  3. “裕同集团&易普优APS项目启动大会”顺利召开

    “裕同集团&易普优APS项目启动大会”顺利召开 ——易普优APS助力裕同集团实现精益生产 2017年7月05日,“裕同集团&易普优APS项目启动大会”顺利召开,裕同集团高级王副总裁.I ...

  4. linux下安装nodejs及linux下解压tar.xz文件

    1.下载nodejs的安装包  2.解压该文件 在linux下,大部分情况下不能直接解压tar.xz的文件. 需要用xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然 ...

  5. PHP原理之对象(一)

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/08/22/412.html 转载请注明出处 或许你知道,或许你不知道,PHP是一个弱类型,动 ...

  6. 转:C++模板学习

    C++ 模板 转:http://www.runoob.com/cplusplus/cpp-templates.html 2018-01-05 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的 ...

  7. Linux内存管理中的slab分配器

    转载自:http://edsionte.com/techblog/archives/4019 Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的. ...

  8. mysql协议简析

    前言 如果要在命令行中连接mysql,最常用的便是 mysql -u root -p 这样指定用户名和密码 当然还可以使用远程连接 mysql -h 127.0.0.1 -u root -p 还有一种 ...

  9. JavaScript的类型体系

    一:总体的类型系 基本类型:数字类型(number),字符串类型(string),布尔类型(boolean); 复合类型:对象(对象,函数,数组等); 无类型:null(有定义),undefined( ...

  10. HNOI2017滚粗记

    DAY0: 高三学长说了考前要么就完全颓废要么就完全学,所以我们就完全开启了颓废模式.上午教练带队去烈士公园游玩,中途机房歌神和QYS一直在谈论如何用LCT动态维护树的直径,ORZORZORZ.... ...