网络编程Socket UDP
图表流程

linux udp测试代码
//server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <arpa/inet.h> #define PORT 8999
#define MAXSIZE 4096 int main(int argc, char *argv[])
{
int sockfd, addr_len;
struct sockaddr_in serv_addr, clnt_addr;
char recvmsg[MAXSIZE], sendmsg[MAXSIZE]; sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < ) {
perror("socket error");
return -;
} serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(serv_addr.sin_zero), ,); if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) < ) {
perror("bind err");
return -;
} while() {
memset(sendmsg, , MAXSIZE);
memset(recvmsg, , MAXSIZE);
addr_len = sizeof(struct sockaddr);
/* 所谓的非阻塞I/O */
if (recvfrom(sockfd, recvmsg, MAXSIZE, , (struct sockaddr *)&clnt_addr, &addr_len) < ) {
perror("recv");
continue;
} printf("begin to accept\n");
printf("recv from %s : %s\n", inet_ntoa(clnt_addr.sin_addr), recvmsg);
strcpy(sendmsg, "who are you ?? Let me cc!");
sendto(sockfd, sendmsg, strlen(sendmsg) + , , (struct sockaddr *)&clnt_addr, addr_len);
} return ;
}
//client.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <arpa/inet.h> #define PORT 8999
#define DESIP "192.168.23.109"
#define MAXSIZE 4096 int main(int argc, char *argv[])
{
int sockfd, addr_len;
struct sockaddr_in des_addr;
char sendmsg[MAXSIZE], recvmsg[MAXSIZE]; sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < ) {
perror("socket error");
return -;
} des_addr.sin_family = AF_INET;
des_addr.sin_port = htons(PORT);
des_addr.sin_addr.s_addr = inet_addr(DESIP);
//bzero(&(des_addr.sin_zero), 8);
memset(&(des_addr.sin_zero), ,);
while () {
memset(recvmsg, , MAXSIZE);
memset(sendmsg, , MAXSIZE);
printf("input:\n");
gets(sendmsg);
if (strcmp(sendmsg, "quit") == ) {
close(sockfd);
printf("close connection\n");
return -;
}
if (sendto(sockfd, sendmsg, strlen(sendmsg) + , , (struct sockaddr *)&des_addr, sizeof(struct sockaddr)) < ) {
perror("sendto");
continue;
}
printf("send ok...\n"); while () {/* 所谓的非阻塞I/O */
addr_len = sizeof(struct sockaddr);
if (recvfrom(sockfd, recvmsg, MAXSIZE, , (struct sockaddr *)&des_addr, &addr_len) < ) {
continue;
}
printf("recv from %s : %s\n", inet_ntoa(des_addr.sin_addr), recvmsg);
break;
}
} return ;
}
参考资料:
网络编程Socket UDP的更多相关文章
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- 铁乐学Python_Day33_网络编程Socket模块1
铁乐学Python_Day33_网络编程Socket模块1 部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 理解socket Socket是应用层与TCP/IP协 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)
java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- 网络编程Socket之TCP之close/shutdown具体解释(续)
接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...
- linux网络编程-socket(37)
在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...
随机推荐
- [课程相关]homework-03
零.准备工作 这次的作业是结对编程,因为一些原因我们的队伍一共有三个人,成员为:梁杰.夏天晗.谢祖三.由于大家不在一个班,交流起来也不是特别方便,所以我们经过讨论决定三个人约一个时间在一起完成这次作业 ...
- IE Firefox Safari 下 通过Div“隐藏”设置Accesskey的submit input
实现效果: 进入页面后 通过快捷键 如Alt+C 调用相关的隐藏按钮 实现功能操作 正常情况下 设置 button => input type="submit" acces ...
- Mysql学习笔记之常用数据类型 (转)
http://www.cnblogs.com/doit8791/archive/2012/05/11/2495319.html 数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.My ...
- MapReduce在Map端的Combiner和在Reduce端的Partitioner
1.Map端的Combiner. 通过单词计数WordCountApp.java的例子,如何在Map端设置Combiner... 只附录部分代码: /** * 以文本 * hello you * he ...
- Linux下RPM软件包的安装及卸载
http://os.51cto.com/art/201001/177866.htm 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的全称为Redhat P ...
- 关于IE6的一些常见的CSS BUG处理
CSS BUG:样式在各浏览器中解析不一致的情况,或者说CSS样式在浏览器中不能正确显示的问题称为CSS BUG: CSS Hack:css hack是指一种兼容css 在不同浏览器中正确显示的技巧方 ...
- js中定义对象的方式有哪些?
1.对象直接量 2.构造函数 3.原型方法 4.动态原型方法
- 关于css制作圆角
三个阶段: 1.背景图片: 2.css2.0+标签模拟圆角: 3.css3.0圆角属性(border-radius). 1.1.背景图片--宽度固定,高度自适应圆角 为容器设置宽度 在主体的上方加一个 ...
- Quartz Scheduler(2.2.1) - Working with TriggerListeners and JobListeners
TriggerListeners and JobListeners Listeners are objects that you create to perform actions based on ...
- Ubuntu 14.0操作系统,修改默认打开方式的方法
Ubuntu 14.0 有内置的视频播放器 Totem,但是使用起来不太习惯,所以在系统的软件中心 下载了gnome Mplayer和s Mplayer,都有打开上次播放的忆功能,只是gnome Mp ...