Socket通信学习(自用笔记)
二、linux下的socket通信实践(ubuntu18.04)
1.实现和windows下的socket例程类似的功能,比较两者的区别
2.参考资料:https://guisu.blog.csdn.net/article/details/7445768
https://blog.csdn.net/feixiaoxing/article/details/8567162
https://blog.csdn.net/liyuefeilong/article/details/47265153
3.实现效果
4.代码
server.cpp
#include<netinet/in.h>
#include<sys/socket.h> //linux系统中关于socket的头文件
// 类似于windows下的“windows.h”,提供统一的API接口(read,write等)
#include<unistd.h>
#include<string.h>
#include<iostream>
#include<arpa/inet.h> //转换点分十进制函数inet_ptoa()
using namespace std;
#define PORT 8000
int main(int argc,char **argv)
{
cout <<"Socket服务端"<<endl;
//创建 Socket
int serversocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr.s_addr=INADDR_ANY;
//绑定套接字
bind(serversocket,(sockaddr*)&server_addr,sizeof(server_addr));
//建立通信套接字标识符
int clientsocket;
sockaddr_in client_addr;
socklen_t len=sizeof(client_addr);
//接受缓冲区
char buffer[100];
//建立通信
while (true)
{
if (listen(serversocket,5))
{
cout<<"连接失败"<<endl;
break;
}
clientsocket=accept(serversocket,
(sockaddr*)&client_addr,&len);
if (clientsocket<0)
{
cout<<"连接失败"<<endl;
}
else
{
cout<<"连接到:"<<inet_ntoa(client_addr.sin_addr)
<<endl;
}
//进入接受消息循环
int num=recv(clientsocket,buffer,100,0);
if (num>0)
{
buffer[num]='\0';
cout<<"客户端说:"<<buffer<<endl;
}
}
close(clientsocket);
close(serversocket);
return 0;
}
client.cpp
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string>
#include <iostream>
#include <unistd.h>
using namespace std;
#define port 8000
#define ip "192.168.1.104"
int main(int argc,char**argv)
{
cout <<"Socket客户端"<<endl;
//创建套接字
int clientsocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in client_addr;
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(port);
client_addr.sin_addr.s_addr=inet_addr(ip);
int check=connect(clientsocket,(sockaddr*)&client_addr,sizeof(client_addr));
if(check<0)
{
cout<<"连接失败"<<endl;
cout<<"请先开启服务器"<<endl;
system("pause");
return(1);
}
else
{
cout<<"连接成功"<<endl;
}
//循环发送
while(true)
{
string text;
const char* msg;
cout <<"请输入:";
cin>>text;
// msg=text.c_str();
send(clientsocket,(char*)text.c_str(),text.length(),0);
}
close(clientsocket);
return (0);
}
5.编译
VScode写完后,直接利用ubuntu的g++编译器进行编译
6.问题汇总
(1).在IDE中写的代码,记得保存后才能正常编译
(2).在参考的例子中还看见了一些优化的函数:bzero();memset();setsockopt()等;涉及到一些其他的操作,以后有机会在深入
7.接下来,尝试夸系统之间的通信,并且结合turtlebot实验需要,在更改函数