socket 编程

相关内容:

   socket 编程

   Linux下tcp通信

 

一、MSG_DONTWAIT | MSG_NOSIGNAL

方法一、fcntl 函数可以将一个socket 句柄设置成非阻塞模式,设置之后每次的对于sockfd 的操作都是非阻塞的。

flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式;

flags = fcntl(sockfd,F_GETFL,0);
fcntl(sockfd,F_SETFL,flags&~O_NUNBLOCK); //设置成阻塞模式;

方法二、recv, send 函数的最后有一个flag 参数可以设置成MSG_DONTWAIT

临时将sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。

recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式的消息发送
send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受

注意:linux中send函数MSG_NOSIGNAL异常消息

Linux 下当连接断开,还发送数据的时候,不仅 send() 的返回值会有反映,而且还会向系统发送一个异常消息,如果不作处理,系统会出 BrokePipe,程序会退

出,这对于服务器提供稳定的服务将造成巨大的灾难。为此,send() 函数的最后一个参数可以设置为 MSG_NOSIGNAL,禁止 send() 函数向系统发送常消息。

二、socket

#include <sys/socket.h> 
int socket(int family, int type, int protocol); //指定期望的通信协议类型,

返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd

AF_INET IPv4协议 SOCK_STREAM(常用) 字节流套接字 protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值

#include<arpa/inet.h>
int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,格式不对返回0,出错返回-1

作用:p代表表达式 n代表数值 以后所写的所有代码中都有可能会需要这个函数,所以这个函数很重要

将char所指向的字符串,通过addrptr指针存放

他的反函数: inet_ntop()作用相反。可以百度查阅这个函数的功能。因为例子里我们没有涉及到,就不介绍了。以后用到的时候再说

需要注意的是:当他发生错误的时候,errno的值会被置为EAFNOSUPPORT 

#include <sys/socket.h> 
int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);//用connect函数来建立与TCP服务器的连接

#include<unistd.h>
int close(int sockfd);//关闭socket,并终止TCP连接

#include <sys/socket.h>
int bind(int sockfd,const struct* myaddr,socklen_t addrlen);//把本地协议地址赋予一个套接字。
//也就是将32位的IPv4或128位ipv6与16位的TCP或者UDP组合

#include<sys/socket.h>
int listen(int sockfd,int backlog)//成功返回0,失败返回-1 listen函数仅由TCP服务器调用

listen函数将会做两件事:

  1:我们在创建套接字的时候使用了socket函数,它创建的套接字是主动套接字,bind函数的功能就是通过这个将主动套接字,变成被动套接字,

告诉内核应该接受指向这个套接字的请求,CLOSED状态变成LISTEN状态。

  2:本函数的第二个参数规定了内核要为该套接字排队的最大连接个数。

#include <sys/socket.h>
int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);//成功返回描述符,失败返回-1

  1、如果第二三个参数为空,代表了,我们对客户的身份不感兴趣,因此置为NULL;

  2、第一个参数为socket创建的监听套接字,返回的是已连接套接字,两个套接字是有区别的,而且非常重要。区别:我们所创建的监听套接字

一般服务器只创建一个,并且一直存在。

而内核会为每一个服务器进程的客户连接建立一个连接套接字,当服务器完成对某个给定客户的服务时,连接套接字就会被关闭。

 

posted @ 2020-05-20 14:00  listxue  阅读(432)  评论(0编辑  收藏  举报