socket相关函数解析

socket的阻塞模式和非阻塞模式
无论是Windows还是Linux,默认创建socket都是阻塞模式的

在Linux中,可以再创建socket是直接将它设置为非阻塞模式

int socket (int __domain, int __type, int __protocol)
1
将__type增加SOCK_NOBLOCK

不仅如此,在Linux上直接利用accept函数返回的代表与客户端通信的socket也提供了一个拓展函数accept4,直接将accept4返回的socket设置为非阻塞的

send和recv函数在阻塞和非阻塞模式下的表现
send和recv函数并不是直接向网络上发送数据和接收数据

send函数是将应用层发送缓冲区的数据拷贝到内核缓冲区中

recv函数是将内核缓冲区的数据拷贝到应用缓冲区

在应用程序A与应用程序B建立TCP连接后,假设A不断调用send函数,会将数据不断拷贝到对应的内核缓冲区,如果应用程序不调用recv函数,那么在应用程序B的内核缓冲区被填满后,A的缓冲区也随后被填满,此时如果A继续调用send函数会有什么后果呢?

当socket处于阻塞模式时,继续调用send/recv函数,程序会阻塞在send/recv调用处
当socket处于非阻塞模式时,继续调用send/recv函数,会返回错误码

创建socket后,会在系统内核分配一定的RAM空间,保存端口号 IP地址等信息。
int socket(int af, int type, int protocol);
af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。

type 为数据传输方式/套接字类型,常用的有 SOCK_STREAM(流格式套接字/面向连接的套接字) 和 SOCK_DGRAM(数据报套接字/无连接的套接字)。

protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。

使用 IPv4 地址,参数 af 的值为 PF_INET。如果使用 SOCK_STREAM 传输数据,那么满足这两个条件的协议只有 TCP,因此可以这样来调用 socket() 函数:
int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //IPPROTO_TCP表示TCP协议
这种套接字称为 TCP 套接字

使用 SOCK_DGRAM 传输方式,那么满足这两个条件的协议只有 UDP,因此可以这样来调用 socket() 函数:
int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //IPPROTO_UDP表示UDP协议
这种套接字称为 UDP 套接字。

send()函数:
函数原型:int send(SOCKET s,const char *buff,int len,int flag);
不论是客户端还是服务端都用send函数来向TCP发送连接的另一端发送数据。
客户端一般用send函数向服务器发送请求,服务器用send发送应答
参数:1. s 指定发送端套接字描述符。2. buff 表示存放发送数据的缓冲区。 3. 实际要发送的字节数, 4.第四个参数一般置零
前三个参数相当于read和write,flag参数值为0 或者添这有个表格函数先比较要发送的数据长度nbytes和socket的s发送缓冲区长度,如果n>s,返回SOCKET_ERROR。

如果在unix系统下,如果send函数在等待协议传送数据时网络断开,调用send的进程会受到一个 SIGPIPE信号,使进程中止。

要连上FTP服务器(即“登录”),必须要有改FTP服务器授权的账号,即只有在有了一个用户标识和一个口令后才能登录FTP服务器,享有FTP服务器提供的服务。
登入FTP的格式
ftp://用户名:密码@FTP服务器IP或者域名:FTP命令端口/路径/文件名
ftp:// list:list@fool.8888.org:6666/soft/list.txt

没有用户名和密码
ftp://192.168.1.2
存在用户名和口令
ftp://soso:123456@192.168.1.2

提供端口(21)和文件夹(/user/a.txt)
ftp://soso:123456@192.168.1.2:21/user/a.txt

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值