计算机视觉应用之socker通信

https://blog.csdn.net/github_39611196/article/details/107702377

本文主要介绍在Linux平台基于C++ socket实现TCP网络通信。

0初步构思

初步的构思是在Linux平台实现一个客户端和一个服务端,首先客户端和服务端建立TCP连接,然后客户端和服务端可以互发消息。

1、通信流程

2、服务端代码

#include<iostream>
#include<conio.h> //kbhit()所在的库
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>//我这里close函数需要此头文件
#include<arpa/inet.h>
using namespace std;
int main()
{
    int server_sockfd;//服务端套接字
    int client_sockfd;//客户端套接字
    int len;
    struct sockaddr_in my_addr;//服务器网络地址
    struct sockaddr_in remote_addr;//客户端网络地址
    socklen_t sin_size;//这里linux的类型是socklen_t
    char recv_buf[BUFSIZ];//数据接收缓冲区
    char send_buf[BUFSIZ];//数据传输缓冲区
    memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
	my_addr.sin_family=AF_INET; //设置为IP通信
	my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
	my_addr.sin_port=htons(8000); //服务器端口号
    //创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
    if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
    {
        cout<<"socket error";
        return 1;
    }
    //套接字绑定在服务器的网络地址下
    if(bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
    {
        cout<<"bind error";
        return 1;
    }
    //监听连接请求 监听队列长度5
    if(listen(server_sockfd,5)<0)
    {
        cout<<"listen error";
        return 1;
    }
    sin_size=sizeof(struct sockaddr_in);
    //等待客户端连接请求
    if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&(remote_addr),&sin_size))<0)
    {
        cout<<"accept error";
        return 1;
    }
    //连接成功 收到地址
    cout<<"accept client"<<inet_ntoa(remote_addr.sin_addr)<<endl;
    len=send(client_sockfd,"Welcome to server",21,0);
    //接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数
    while(1)
    {
    	//接收客户端输入
    	len=recv(client_sockfd,recv_buf,BUFSIZ,0);
        if(len > 0){
		recv_buf[len]='\0';
		cout<<"Received:"<<recv_buf<<" ,Info Length:"<<len<<endl;        	
        }
        
        //发送消息给客户
        cout<<"Enter string to send:";
	cin>>send_buf;
	if(!strcmp(send_buf, "quit")) break;
	len=send(client_sockfd, send_buf, strlen(send_buf), 0); 
        }
    }
    //关闭套接字
    close(server_sockfd);
    close(client_sockfd);
    return 0;
}

3、客户端代码

#include<iostream>
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;
int main()
{
	int client_sockfd;
	int len;
	struct sockaddr_in remote_addr;
   	char recv_buf[BUFSIZ];//数据接收缓冲区
   	char send_buf[BUFSIZ];//数据传输缓冲区
	memset(&remote_addr, 0, sizeof(remote_addr));//数据初始化--清零
	remote_addr.sin_family=AF_INET;//设置为IP通信
	remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
	remote_addr.sin_port=htons(8000);//服务器端口号
	
	//创建客户端套接字 IPv4 tcp
	if((client_sockfd=socket(PF_INET, SOCK_STREAM, 0))<0)
	{
		cout<<"socket error";
		return 1;
	}
	
	//绑定服务器网络地址
	if(connect(client_sockfd, (struct sockaddr*)&remote_addr, sizeof(struct sockaddr))<0)
	{
		cout<<"connect error";
		return 1;
	} 
	
	cout<<"connected to server"<<endl;;
	len=recv(client_sockfd, recv_buf, BUFSIZ, 0);//接受服务端消息
	recv_buf[len] = '\0';
	
	//循环的发送接受信息并打印接受信息(可以按需发送)--struct sockaddr))<0
	while(1)
	{
		//发送消息给服务端
		cout<<"Enter string to send:";
		cin>>send_buf;
		if(!strcmp(send_buf, "quit")) break;
		len=send(client_sockfd, send_buf, strlen(send_buf), 0);
		
		//从客户端接受消息
		len=recv(client_sockfd,recv_buf,BUFSIZ,0);
        if(len > 0){
		recv_buf[len]='\0';
		cout<<"Received:"<<recv_buf<<" ,Info Length:"<<len<<endl;        	
        }
	}
	close(client_sockfd);
	return 0;
}

4、优化方向

将输入设置为无阻塞的,即可以连续接收和发送。

注:在退出连接后,如何解除端口绑定?

1.查看800端口是否被占用:

netstat -anp | grep 8000

输出结果:tcp        4      0 127.0.0.1:41766         127.0.0.1:8000          CLOSE_WAIT  2972/./client  

由上可知8000端口已经被占用,占用进程号为2972。

2、终止该进程

kill 2972

注意:

C++ Socket 端口被占用解决方法:

windows:

    BOOL bReuseaddr=TRUE;
    setsockopt (s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

Linux

    int opt = 1;
    setsockopt(LisSockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof( opt ));

将套接字属性设置为 SO_REUSEADDR (允许套接口和一个已在使用中的地址捆绑),可以解决绑定失败问题!

https://blog.csdn.net/qq_34039018/article/details/103557323?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fanuc机器人是一种高性能的工业机器人,它具有广泛的应用领域,可以在制造业的各个环节中发挥重要作用。而Socket视觉程序是Fanuc机器人中一种重要的功能,它可以使机器人能够通过视觉系统来实现更精确、更灵活的工作。 首先,Socket视觉程序是一种基于网络通信的机器人和图像处理设备之间的联动系统。通过这个系统,机器人可以利用图像处理设备获取到的图像信息,进行图像识别、目标检测等复杂视觉任务。这样一来,机器人在执行任务时就可以根据实际情况进行智能决策和操作,提高了生产效率和质量。 其次,Socket视觉程序可以应用于许多领域。比如,在装配线上,机器人可以通过视觉系统识别零件的位置和角度,从而能够更准确地进行抓取和安装操作。在焊接过程中,机器人可以通过视觉系统检测焊缝的尺寸和质量,从而能够实现更精确和一致的焊接质量。此外,Socket视觉程序还可以应用于质量检测、物料搬运等工作中,进一步提高了生产过程的自动化水平。 最后,使用Fanuc机器人的Socket视觉程序需要一定的专业技术和知识。首先,需要对机器人操作和编程有一定的了解,能够灵活运用机器人控制指令和程序。其次,需要对图像处理和计算机视觉技术有一定的了解,能够使用相关软件进行图像处理和分析。此外,还需要具备一定的项目管理能力,能够根据实际需求制定合理的视觉程序,并进行实施和调试。 总之,Fanuc机器人的Socket视觉程序是一种重要的工具,在现代制造业中起到了至关重要的作用。通过这个程序,机器人能够利用视觉系统实现更精确、更灵活的工作,提高生产效率和质量。在使用这个程序时,需要具备一定的专业知识和技术,以确保程序的正常运行和有效应用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值