日常笔记之socket理解1

Socket 的理解?

Socket从字面上理解就是插头,翻译成术语就是套接字.?

 可以用水龙头/漏斗来与Socket来作类比.
–  一个网络通道(TCP或UDP)可以看成是一个水管.
–  在两个网络设备之间交换的数据看成是水.
–  在网络上传输数据相当于是通过水管在送水.
/* 用到如下声明
typedef OS_STATUS int;
#define OS_OK 0
#define OS_ERROR -1
#define OS_NOT_FOUND -2
必须使用头文件 #include <winsock.h>
*/
OS_STATUS _Win32GetIpByHost(char * host_name,char * ip_addr,int ip_len)
{
struct sockaddr_in dest;
struct hostent *hp = NULL;
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
/* 首先假设是一个点分形式 IP 地址,用转换函数转换一次*/
if ((dest.sin_addr.s_addr = inet_addr(host_name)) != INADDR_NONE)
{ /* 如果成功,直接 IP 地址转换回去,多余空格,0 字符将被去掉*/
snprintf(ip_addr,ip_len,"%s", inet_ntoa(dest.sin_addr));
return (OS_OK);
}
/* 然后假设是一个域名,尝试转换一次*/
if ((hp = gethostbyname(host_name)) != NULL)
{
memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
dest.sin_family = hp->h_addrtype;
snprintf(ip_addr,ip_len,"%s", inet_ntoa(dest.sin_addr));
return OS_OK;
}
return OS_ERROR;
}


Socket 基本编程
–  这样一个机器要接到水,必须先要开一个水头龙.这个龙头就是SOCKET,因为一个机器
可能有多个水龙头,为了区别开,必须要编号,这个编号就是端口号(PORT)
–  然后这个机器要建一个水管延伸到另外一台机器上的指定的漏斗上(远端的指定端口的
SOCKET).这个过程就是创建网络联接的过程
–  建立成功后,对方在它的机器上的漏斗(SOCKET)放水,通过水管,接到本机的水龙头
(SOCKET),就可以得到水
–  TCP管道相当于是一点水都不漏的水管,对方的水要不一点都送不过来,要不完整的把所
有水都送过来
–  UDP相当于是一个有可能漏水的水管,接收方必须要自已用量杯来检查才可以知道送过
来的水是不是跟发送方的水一样多.
Socket 的创建流程
? 因此一个台机器首先要知道远端机器的IP地址和端口才能与对方通讯.
? 首先要创建一个SOCKET(水龙头)
– 用socket()函数
? 为这个SOCKET绑定端口(为水龙头指定一个编号)
– 用bind()函数
? 然后通过这个socket跟远方机器建立联接
– TCP用connect()函数,UDP没有连接概念,在发送时指定
? 建立联系成功后,通过接,发函数来交换数据
– send(),recv(),sendto(),recvfrom(),write(),read()
? 使用完毕联接,要关闭水管
– close()
– Windows下使用 closesocket();
? TCP服务器有一些特殊要求,必须要先建一个侦听的SOCKET/水龙头,当有一个TCP客户
端发来请求,还要再建专门一个水龙头与这个客户端建立水管与这个一客户端来交换数
据.
– listen(),accept()函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值