Linux网络编程练习,宝塔linux面板终端作为服务器端,本机作为客户端,客户端向终端发送字符串,终端输出接收到的字符串,无法建立通信。
/*客户端代码,运行在本地的代码*/
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //指定IPv4创建流式套接字
if(sockfd < 0)
{
perror("socket error");
return -1;
}
printf("socket = %d\n",sockfd);
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = 4444;
cliaddr.sin_addr.s_addr = inet_addr("192.168.171.129");//指定本地IP和端口
int ret = bind(sockfd, (struct sockaddr*)&cliaddr, sizeof(cliaddr));//绑定
if(ret < 0)
{
perror("bind error");
close(sockfd);
return -1;
}
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = 3333;
servaddr.sin_addr.s_addr = inet_addr("172.16.173.41");//指定服务器IP和端口
ret = connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));//申请连接服务器
if(ret< 0)
{
perror("connect error");
close(sockfd);
}
char buf[100] = {0};
fgets(buf, sizeof(buf), stdin);
ret = send(sockfd, buf, sizeof(buf), 0);//向服务器发送buf
if(ret < 0)
{
perror("send error");
close(sockfd);
return -1;
}
/*服务器端代码,也就是运行在宝塔Linux面板终端上的程序代码*/
int sockFd = socket(AF_INET, SOCK_STREAM, 0);//create socket to get fd
if(sockFd < 0)
{
perror("socket error");
return -1;
}
printf("sockFd = %d\n",sockFd);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = 3333;//PORT
servaddr.sin_addr.s_addr = inet_addr("172.16.173.41");//服务器端IP
int ret = bind(sockFd, (struct sockaddr*)&servaddr, sizeof(servaddr));//将套接字与指定端口绑定
if(ret < 0)
{
perror("bind error");
close(sockFd);
return -1;
}
printf("bind OK\n");
ret = listen(sockFd, 5);//监听套接字
if(ret < 0)
{
perror("listen error");
close(sockFd);
return -1;
}
printf("listening...\n");
struct sockaddr_in cliaddr;
socklen_t addrlen = sizeof(cliaddr);
int connfd = accept(sockFd, (struct sockaddr*)&cliaddr, &addrlen);//连接成功后返回新建的套接字
if(connfd < 0)
{
perror("accept error");
close(sockFd);
return -1;
}
char buf[100] = {0};
ret = recv(connfd, buf, sizeof(buf), 0);//接收从客户端发过来的字符串
if(ret < 0)
{
perror("recv error");
close(connfd);
close(sockFd);
return -1;
}
printf("receive: %s\n",buf);
close(connfd);
close(sockFd);
return 0;
分别编译运行后,结果如下;左边是服务器终端(宝塔Linux面板终端),右边是客户端终端(也就是本机)
从右边的perror看出,应该是connect()函数发出的TCP连接请求失败了,原因是服务器端拒绝连接。服务器端是在阿里云租的ECS服务器,但是在云服务器管理控制台已经将3333端口打开了
还有一个很奇怪的现象,两台机器ping百度都是能连上的;但是两台机器ping对方就都连不上
两端能进行通信。
通信的话本地请求线上可以让线上接收到数据 但是你线上通本地怎么通?那走的是外网ip,你拿内网?