文章目录
1、UDP通信协议,服务器端和客户端无需建立连接,只需要知道对方套接字的地址信息就可以发送数据
2、UDP通信流程图:

功能:创建套接字并返回套接字描述符
头文件:
#include<sys/socket.h>
函数原型:
int socket(int family,int type,int protocol)
参数:
family:协议族
AF_INET:IPv4协议
AF_INET6:IPv6协议
type:套接字类型
SOCK_STREAM:流式套接字(tcp)
SOCK_DGRAM:数据报套接字(udp)
protocol:0
返回值:
非负套接字描述符
功能:将套接字与IP地址和端口号绑定
头文件:
#include<sys/socket.h>
函数原型:
int bind(int sockfd,(struct sockaddr *)my_addr,int addrlen)
参数:
sockfd:套接字描述符
my_addr:绑定的地址
addrlen:地址长度
功能:发送数据
头文件:
#include<sys/socket.h>
函数原型:
int send(int sockfd,const void *buf,int len,int flags,const struct sockaddr *to,int tolen);
参数:
sockfd:套接字描述符
buf:发送缓存区的地址
len:发送数据的长度
flags:一般为0
to:接收方套接字的ip地址和端口号
tolen:地址长度
返回值:
实际发送的字节数
功能:接收数据
头文件:
#include<sys/socket.h>
函数原型:
int recv(int sockfd,void *buf,int len,unsigned int flags,const struct sockaddr *from,int fromlen)
参数:
sockfd:套接字描述符
buf:存放接收数据的缓存区的地址
len:接收数据的长度
flags:一般为0
from:发送方的ip地址和端口号
fromlen:地址长度
返回值:
实际接收的字节数
功能:关闭套接字
头文件:
#include<sys/socket.h>
函数原型:
int close(int sockfd)
参数:
sockfd:套接字描述符
1、代码功能:两个进程可以相互收发数据
2、实现需要开启两个终端,同时运行相同的代码,一端发送,一端接收
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdio.h>
struct sockaddr_in my_addr;//定义本段代码套接字
struct sockaddr_in to_addr;//定义另一端代码套接字
int fd;//定义套接字描述符
void *send_fun(void *p)//处理发送功能的线程函数
{
char buf[100] = { 0 };
while(1)
{
gets(buf);//输入字符串
sendto(fd, buf, 100, 0, (struct sockaddr*)&to_addr, 16);//发送数据
}
}
int main(int argc, char *argv[])
{
pthread_t id;//线程id
fd = socket(AF_INET, SOCK_DGRAM, 0);//套接字fd赋值
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(atoi(argv[3])); //argv[3] 自己的端口号 9999
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("192.168.31.252"); INADDR_ANY 得到当前计算机的ip地址
bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));//绑定自己的ip地址和端口号
to_addr.sin_family = AF_INET;
to_addr.sin_port = htons(atoi(argv[2])); //argv[2]对方的端口号 8888
to_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1]对方的ip地址 127.0.0.1
pthread_create(&id, NULL, send_fun,NULL);//创建线程
while(1)
{
char buf[100];
int len = 16;
recvfrom(fd, buf, 100, 0, (struct sockaddr *)&to_addr, &len);//接收数据
printf("from %d:%s\n", ntohs(to_addr.sin_port), buf);//输出对方的IP地址和端口号
}
}
结果展示
可以实现相互发送数据的两端:
1、127.0.0.1是环回地址
2、8888和9999是两端套接字地址的端口号


1、UDP通信是不可靠的,其中一点是没有建立连接机制,使用ip地址进行数据的传输
2、UDP和TCP主要在于sendto和recvfrom两个函数,这两个函数参数包括了对方的ip地址和端口号,这点与TCP通信区别较大
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT