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) 使用指定的地址族.套接字类 ...
随机推荐
- Drools 函数学习
Drools 函数学习 函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量.函数的编写位置可以是规则文件当中 pac ...
- Javascript 构造函数原型继承机制
我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...
- js类数组
类数组 - [ Array-like ] : objects 1. what's Array-like 类数组和数组很像,但是数组的很多方法却不能用,这就很尴尬了~ 像 arguments.nodel ...
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- XCode6.3上使用opencv教程(MacOSX 10.10)
OpenCV 是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pyth ...
- 【翻译】Express web应用开发 第一章
本章节是一个对初学者友好的Express介绍.你将学习到Express的基础知识.核心概念和实现一个Express应用的组成部分.现阶段我们不需要做太多的编码,本章节会让你熟悉和习惯Express,为 ...
- *HDU1848 博弈
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- C#中分割字符串输出字符数组
来自博客园 http://www.cnblogs.com/yugen/archive/2010/08/18/1802781.html 1.用字符串分隔: using System.Text.Reg ...
- 【SQLServer】“无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法
从今天起,把编程中遇到的所有问题都记录下来,以便今后参考,以及方便网友查阅,希望我的问题可以帮助到很多志同道合的人们,我也是受很多前辈的提点,一步一步走来,希望大家都不要吝啬,将自己遇到的问题记录下来 ...
- WPF整理-Style
"Consistency in a user interface is an important trait; there are many facets of consistency, ...