Socket programing(make a chat software) summary 1:How to accsess LAN from WAN
First we should know some basic conceptions about network:
1.Every PC is supposed to have its own IP,So we can connent other's PC by WAN.That's just like a ID of netwrok world.
2.But if every PC has its own IP,Then IPs of this world will be insufficient.Because IPv4 is only 32-bit.
3.So, in fact we are not using a IP of WAN, but using a IP of LAN.
If there is a IP of 192.168.2.100 in one LAN, and there will also be another IP of 192.168.2.100 in another LAN.
It's not contradict because we use NAT to convert the IP of LAN into the IP of WAN(the unique ip).
As for my software,I need two PC connected and chatting.But the IP of normal users are all LAN. different LANs.So they can not connect just by Socket program.
So,I must convert the IP from LAN to WAN.
At least one --- the server's.
I use a technique of PORT MAPPING. implemented by a software called phddns.
Download the phddns: phddns_3.0_x86_64.deb
dpkg -i phddns_3.0_x86_64.deb

Use the SN and password to log in the website of phddns.
Then set the network penetration:

As for the code, very simple C socket program.
/**
* client program of chat
* by localhost pur whoami Atum
* 0ct 5 2016
* version 1.0
**/ #include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/types.h> #define MAXBUF 1024
#define MAC_SIZE 18
#define IP_SIZE 16 // get ip by domain
int get_ip_by_domain(const char *domain, char *ip)
{
char **pptr;
struct hostent *hptr;
hptr = gethostbyname(domain);
if(NULL == hptr)
{
printf("gethostbyname error for host:%s/n", domain);
return -;
}
for(pptr = hptr->h_addr_list ; *pptr != NULL; pptr++)
if (NULL != inet_ntop(hptr->h_addrtype, *pptr, ip, IP_SIZE) )
return ;
return -;
} int main(int argc, char **argv)
{
int sockfd, len;
struct sockaddr_in dest; char buffer[MAXBUF + ];
//1.create socket object
if((sockfd = socket(AF_INET, SOCK_STREAM, )) < )
{
perror("socket");
exit(errno);
}
printf("socket created.\n");
//set dest 0
bzero(&dest, sizeof(dest));
//address protocal
dest.sin_family = AF_INET;
//the port of server
dest.sin_port = htons(atoi(argv[]));
char ip[IP_SIZE];
get_ip_by_domain(argv[], ip);
//get the ip of server
if (inet_aton(ip, (struct in_addr *) &dest.sin_addr.s_addr) == )
{
perror(argv[]);
exit(errno);
}
//connect the server
if(connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) == -)
{
perror("connect");
exit(errno);
}
printf("server connected\n"); printf("pls send message to send:");
fgets(buffer,MAXBUF,stdin);
send(sockfd,buffer,strlen(buffer) - , );
return ;
}
/**
* server program of lsp-chat
* by WHOAMI localhost purstar Atum
* Oct 5 2016
* version 1.0
**/ #include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{
unsigned int my_port, lisnum;
int sockfd, new_fd;
socklen_t len;
if (argv[])
my_port = atoi(argv[]);
else
my_port = ;
if (argv[])
lisnum = atoi(argv[]);
else
lisnum = ;
struct sockaddr_in server_addr, clients_addr;
//create socket object
if((sockfd = socket(AF_INET, SOCK_STREAM, ))==-)
{
perror("socket");
exit(EXIT_FAILURE);
}
//set server_addr 0
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(my_port);
if (argv[])
server_addr.sin_addr.s_addr = inet_addr(argv[]);
else
server_addr.sin_addr.s_addr = INADDR_ANY;
//bind the socket with ip and port
if (bind(sockfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -)
{
perror("bind");
exit(EXIT_FAILURE);
}
//listern and wait for connecting
if(listen(sockfd,lisnum) == -)
{
perror("listen");
exit(EXIT_FAILURE);
}
printf("wait for connect\n");
len = sizeof(struct sockaddr);
//get the client connection
if((new_fd = accept(sockfd, (struct sockaddr *) &clients_addr, &len) == -))
{
perror("accept");
exit(EXIT_FAILURE);
}
else
printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(clients_addr.sin_addr),ntohs(clients_addr.sin_port),new_fd);
return ;
}
Then run the server program and the client program:

parameters are local ip and port.

parameters are domain name and port mapped by phddns
It works.
Test with my friend's help,also no problem:

Socket programing(make a chat software) summary 1:How to accsess LAN from WAN的更多相关文章
- 12 Best Live Chat Software for Small Business Compared (2019) 最佳的wordpress在线聊天工具推荐插件 来帮你和潜在客户互动
12 Best Live Chat Software for Small Business Compared (2019) Did you know that more than 67% of ...
- (OK) Linux epoll模型—socket epoll server client chat
http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/d ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- C# socket 实现消息中心向消息平台 转发消息 (修改)
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
- C# socket 实现消息中心向消息平台 转发消息
公司用到,直接粘代码了 using System; using System.Collections.Generic; using System.Configuration; using System ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- WPF socket通讯 UDP接收消息
客户端: private Socket socket; private IPEndPoint ipEndPoint; private void sendMessageHandler() { //服务端 ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- Socket(TCP)客户端请求和服务端监听和链接基础(附例子)
一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...
随机推荐
- Android Studio中获取SHA1或MD5的方法
原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...
- Vue - 在v-repeat中使用计算属性
1.从后端获取JSON数据集合后,对单条数据应用计算属性,在Vue.js 0.12版本之前可以在v-repeat所在元素上使用v-component指令 在Vue.js 0.12版本之后使用自定义元素 ...
- 网站banner写法
css .banner{ width: %; height: 375px; background: url(X.jpg) no-repeat center;} html <div class=& ...
- js排序算法总结——冒泡,快速,选择,插入,希尔,归并
相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...
- JavaScript解惑记之Array.prototype.sort()
前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...
- iOS 遇到的错误总结
1.[[[NSBundle mainBundle] loadNibNamed:@"UIFeedbackController" owner:nil options:nil] firs ...
- 【Telerik】实现列表单元格中添加复选框,进行状态(是、否)判断
前台界面: 需求:实现对每条细则是否必备进行判断,必备就勾选,否则不勾选. 首先:要保证列表GridView是可编辑的(IsReadOnly=false) 表格代码 其次:单元格的数据绑定要保证是双向 ...
- Hive_配置远程Metastore
注 : 待测试 一.准备两三台linux机器,最好是hadoop集群环境 机器A:10.0.0.2 机器B:10.0.0.3 机器C:10.0.0.4 二.个机器安装信息 机器A安装mysql(用于存 ...
- JS图片上传预览
HTML部分: <img id="avatar" class="editable img-responsive" alt="头像" s ...
- Oracle EBS - Profile Setting
EBS Profile Setting (Personalization Basics): Personalization Basics For R12 Forms Enable personaliz ...