创建一个socket的函数int socket(int domain, int type, int protocol) { sockfd = socket(domain, type, protocol); } domain指定使用何种的地址类型,里面的参数定义在linux的sys/socket.h中,比较常用的有: PF_INET(协议族),AF_INET(地址族): Ipv4网络协议 PF_INET, AF_INET6: Ipv6网络协议 AF_UNIX, AF_LOCAL 本地进程间通讯 type参数的作用是设置通信的协议类型,可能的取值如下所示: SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。 OOB: 在所有数据传送前必须使用connect()来建立连接状态。 SOCK_DGRAM: 使用不连续不可靠的数据包连接。 SOCK_SEQPACKET: 提供连续可靠的数据包连接。 SOCK_RAW: 提供原始网络协议存取。 SOCK_RDM: 提供可靠的数据包连接。 SOCK_PACKET: 与网络驱动程序直接通信。 参数protocol用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0即可。 设置nonblock mode { flag = fcntl(sockfd, F_GETFL, 0) fcntl(sockfd, F_SETFL, flag|O_NONBLOCK) //设置成非阻塞模式; fcntl(sockfd, F_SETFL, flags&~O_NONBLOCK); //设置成阻塞模式; } socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。 非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。 { /* reuse the address */ /* 设置了reuseaddr后,服务程序停止后可立即重启*/ int32_t choice = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &choice, sizeof (int32_t)); /* 设置非阻塞模式,关闭Nagle算法,用来提高交互的实时性*/ int32_t choice = 1; setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &choice,sizeof(int32_t)); struct sockaddr_in addr; /* clean up */ memset(&addr,0,sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(port); /* 把点分十进制的IP转换成一个长整型(u_long)*/ if (service_type == SERVER) { /*如果是server的话,就用inet_addr("0.0.0.0"),也就是INADDR_ANY*/ addr.sin_addr.s_addr = htonl(INADDR_ANY); } else { addr.sin_addr.s_addr = inet_addr(addr); } /* bind the socket for internet socket */ bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr)); } 未完,待续epoll学习:https://www.cppfans.org/1418.html http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
socket 使用
最新推荐文章于 2023-12-21 16:10:21 发布