socket常用函数_socket是可重入函数吗

socket常用函数_socket是可重入函数吗前言socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写.具体介绍见本博客另一篇文章:https://blog.csdn.net/wufuhuai/article/details/79747912实现我们都知道socket不仅能够进行跨进程通信,而且socket是可以双向通信的,即是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

前言

socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写. 具体介绍见本博客另一篇文章: https://blog.csdn.net/wufuhuai/article/details/79747912

实现

我们都知道socket不仅能够进行跨进程通信, 而且socket是可以双向通信的, 即是可读可写的; 故本文主要设计思想是创建两个回环的socket进行进程间通信, 即创建两个socket进行本机跟本机间通信.

#include <stdlib.h>
#include <stdio.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
static int __stream_socketpair(struct addrinfo* addr_info, SOCKET sock[2]){
SOCKET listener, client, server;
int opt = 1;
listener = server = client = INVALID_SOCKET;
listener = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); //创建服务器socket并进行绑定监听等
if (INVALID_SOCKET == listener)
goto fail;
setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,(const char*)&opt, sizeof(opt));
if(SOCKET_ERROR == bind(listener, addr_info->ai_addr, addr_info->ai_addrlen))
goto fail;
if (SOCKET_ERROR == getsockname(listener, addr_info->ai_addr, (int*)&addr_info->ai_addrlen))
goto fail;
if(SOCKET_ERROR == listen(listener, 5))
goto fail;
client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); //创建客户端socket,并连接服务器
if (INVALID_SOCKET == client)
goto fail;
if (SOCKET_ERROR == connect(client,addr_info->ai_addr,addr_info->ai_addrlen))
goto fail;
server = accept(listener, 0, 0);
if (INVALID_SOCKET == server)
goto fail;
closesocket(listener);
sock[0] = client;
sock[1] = server;
return 0;
fail:
if(INVALID_SOCKET!=listener)
closesocket(listener);
if (INVALID_SOCKET!=client)
closesocket(client);
return -1;
}
static int __dgram_socketpair(struct addrinfo* addr_info,SOCKET sock[2])
{
SOCKET client, server;
struct addrinfo addr, *result = NULL;
const char* address;
int opt = 1;
server = client = INVALID_SOCKET;
server = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol);  
if (INVALID_SOCKET == server)
goto fail;
setsockopt(server, SOL_SOCKET,SO_REUSEADDR, (const char*)&opt, sizeof(opt));
if(SOCKET_ERROR == bind(server, addr_info->ai_addr, addr_info->ai_addrlen))
goto fail;
if (SOCKET_ERROR == getsockname(server, addr_info->ai_addr, (int*)&addr_info->ai_addrlen))
goto fail;
client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); 
if (INVALID_SOCKET == client)
goto fail;
memset(&addr,0,sizeof(addr));
addr.ai_family = addr_info->ai_family;
addr.ai_socktype = addr_info->ai_socktype;
addr.ai_protocol = addr_info->ai_protocol;
if (AF_INET6==addr.ai_family)
address = "0:0:0:0:0:0:0:1";
else
address = "127.0.0.1";
if (getaddrinfo(address, "0", &addr, &result))
goto fail;
setsockopt(client,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt));
if(SOCKET_ERROR == bind(client, result->ai_addr, result->ai_addrlen))
goto fail;
if (SOCKET_ERROR == getsockname(client, result->ai_addr, (int*)&result->ai_addrlen))
goto fail;
if (SOCKET_ERROR == connect(server, result->ai_addr, result->ai_addrlen))
goto fail;
if (SOCKET_ERROR == connect(client, addr_info->ai_addr, addr_info->ai_addrlen))
goto fail;
freeaddrinfo(result);
sock[0] = client;
sock[1] = server;
return 0;
fail:
if (INVALID_SOCKET!=client)
closesocket(client);
if (INVALID_SOCKET!=server)
closesocket(server);
if (result)
freeaddrinfo(result);
return -1;
}
int socketpair(int family, int type, int protocol,SOCKET recv[2]){
const char* address;
struct addrinfo addr_info,*p_addrinfo;
int result = -1;
memset(&addr_info, 0, sizeof(addr_info));
addr_info.ai_family = family;
addr_info.ai_socktype = type;
addr_info.ai_protocol = protocol;
if (AF_INET6==family)
address = "0:0:0:0:0:0:0:1";
else
address = "127.0.0.1";
if (0 == getaddrinfo(address, "0", &addr_info, &p_addrinfo)){
if (SOCK_STREAM == type)
result = __stream_socketpair(p_addrinfo, recv);   //use for tcp
else if(SOCK_DGRAM == type)
result = __dgram_socketpair(p_addrinfo, recv);    //use for udp
freeaddrinfo(p_addrinfo);
}
return result;
}
int main ()
{
int recv_pair[2];       /* A socket pair to unblock select, when needed */
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2,0);
if (WSAStartup(socketVersion, &wsaData) != 0)
{
printf("Init socket dll err");
}
if(socketpair(AF_INET, SOCK_STREAM, 0, recv_pair) < 0)
printf("Error setting Socket pair...");
WSACleanup();
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182174.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Odin Inspector 系列教程 — 常见问题解答(FAQ)

    Odin Inspector 系列教程 — 常见问题解答(FAQ)1.Odin多达约90种不同的特性,有可以快速预览每种特性的效果吗?可以选择Tools/OdinInspector/AttributeOverview进行快速预览,如果需要更详细的说明,可以查看主页革命性Unity编辑器扩展工具—OdinInspector系列教程,配合示例工程服用效果更佳2.可以禁用指定的Odin绘制特性吗?Odin…

  • 初衷

    本博客会不定期做技术分享,在学习的过程中遇到或者踩到的坑也会拿出来给大家分享,个人感觉技术这个东西在于分享,交流产生价值。本博客也会记录我的成长,希望在当中留下些许痕迹让刚入门的师傅们参考,最后我

    2021年12月11日
  • ORACLE优化器

    一ORACLE优化器概述ORACLE优化器是用于生成SQL语句访问数据库时使用的执行计划的。ORACLE优化器通过使用ORACLE搜集的关于数据库对象的统计数据来生成SQL语句的访问计划(使用什么对象)并执行计划(使用何种操作)    二ORACLE优化器的分类 ORACLE优化器分为三类:1)RULE优化器:基于规则的优化器相对比较简单,通过检查数据库的

  • Struts2 FilterDispatcher的作用[通俗易懂]

    Struts2 FilterDispatcher的作用[通俗易懂]org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,负责四个方面的功能:  (1)执行Actions  (2)清除ActionContext  (3)维护静态内容  (4)清除request生命周期内的XWork的interceptors  另注:该过滤器应该过滤所有的请求URL。一般被设置

  • 激活成功教程quartus ii13.0_quartus ii 13.0安装

    激活成功教程quartus ii13.0_quartus ii 13.0安装文章目录一、QuartusII的下载二、QuartusII的安装三、QuartusII的激活成功教程1.下载激活成功教程器文件2.激活成功教程器的使用一、QuartusII的下载百度网盘下载链接:https://pan.baidu.com/s/1a9d-bq9RZmWrRV542X4IEA提取码:ifte说明:本链接来自于正点原子官方资料下载二、QuartusII的安装解压后双击运行exe文件:点击next:勾选“Iaccepttheagreement”,然后点击Next:

    2022年10月10日
  • Jlink或者stlink用于SWD接口下载程序

    Jlink或者stlink用于SWD接口下载程序最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号