求能跨广域网通信的SOCKET源码

MoonlightDesigner 2013-06-24 11:33:41

最近学WINDOW下的SOCKET编程,但不知道如何跨广域网通信,希望那位高人可以给份服务端和客户端的源码,简单点。。。谢谢!!
...全文
224 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
有公网IP就行了,跟网络编程无关
www_adintr_com 2013-06-24
  • 打赏
  • 举报
回复
如果其中一个有公网的 IP 就好办了, 和你写的局域网通信程序一样的. 如果都是内网 IP, 那就要做 P2P 穿墙才行了.
MoonlightDesigner 2013-06-24
  • 打赏
  • 举报
回复
在下初学SOCKET编程,网络路由配置的不是很懂。。。我想要的是一份服务端以及客户端的代码,假设服务端与客户端使用不同的网络(铁通和电信),我开启报务端之后,然后我在另外一台使用与服务端不同网络的电脑执行客户端,客户端能发数据给服务端就可以了。。。。写了很多,希望帮帮忙。。。谢谢各位
飞天御剑流 2013-06-24
  • 打赏
  • 举报
回复
这个跟winsock无关,而是网络路由配置问题。
恨天低 2013-06-24
  • 打赏
  • 举报
回复
啥个意思?你需要两个IP,都能互相ping通即可。
Xiaona_Song 2013-06-24
  • 打赏
  • 举报
回复
看《WinSock网络编程经络》吧,这有socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
一叶之舟 2013-06-24
  • 打赏
  • 举报
回复
用PTP打洞。
ztenv 版主 2013-06-24
  • 打赏
  • 举报
回复
引用 10 楼 ubuntu_ai 的回复:
[quote=引用 9 楼 lianshaohua 的回复:] UDP需要NAT的;192.168.xx.xx是一个非法的公网IP,当然不行了
那怎么设置啊?[/quote] 1、 NAT(但效果不太好) 2、在路由器上做端口映射 3、...
MoonlightDesigner 2013-06-24
  • 打赏
  • 举报
回复
我写的程序可以局域网通信,但无法进行广域网通信。。。
worldy 2013-06-24
  • 打赏
  • 举报
回复
引用 10 楼 ubuntu_ai 的回复:
[quote=引用 9 楼 lianshaohua 的回复:] UDP需要NAT的;192.168.xx.xx是一个非法的公网IP,当然不行了
那怎么设置啊?[/quote] 本质上讲,局域网能同,广域网也应该能通,但是现在通信的两台电脑一般都置于路由器之后,通信被路由器隔离开了,因此,通信的服务器端必须设置端口映射,将你使用的服务器端口映射到服务器端的一个ip地址上
MoonlightDesigner 2013-06-24
  • 打赏
  • 举报
回复
引用 9 楼 lianshaohua 的回复:
UDP需要NAT的;192.168.xx.xx是一个非法的公网IP,当然不行了
那怎么设置啊?
ztenv 版主 2013-06-24
  • 打赏
  • 举报
回复
UDP需要NAT的;192.168.xx.xx是一个非法的公网IP,当然不行了
MoonlightDesigner 2013-06-24
  • 打赏
  • 举报
回复
********************** client.cpp ***************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
 

int port = 6789;

int main()
{
	WSAData wsadata;
	if(WSAStartup(MAKEWORD(1,1), &wsadata))
		return 0;
		
    int socket_descrīptor;
    int iter = 0;
    char buf[80];
    struct sockaddr_in address;

    /* Initialize socket address structure for Interner Protocols */
    ZeroMemory(&address, sizeof(address)); // empty data structure
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("192.168.xx.xx");
    address.sin_port = htons(port);

    /* Create a UDP socket */
    socket_descrīptor = socket(AF_INET, SOCK_DGRAM, 0);

    //Loop 20 times (a nice round number ) sending data
    for(iter = 0; iter <= 20; iter++)
    {
        sprintf(buf, "data packet with ID %d\n", iter);
        sendto(socket_descrīptor, buf, sizeof(buf), 0, (struct sockaddr *)&address, sizeof(address));
    }    

    /* send a termination message */
    sprintf(buf, "stop\n");
    sendto(socket_descrīptor, buf, sizeof(buf), 0, (struct sockaddr *)&address, sizeof(address)); //address is the target of the message send
     
    printf("Message Sent, Terminating\n");
    
    WSACleanup();
    return 0;
}
**************************** server.cpp ***********************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
 

int port = 6789;

int main()
{WSAData wsadata;
	if(WSAStartup(MAKEWORD(1,1), &wsadata))
		return 0;
    int sin_len;
    char message[256];
    int socket_descrīptor;
    struct sockaddr_in sin;
    printf("Waiting for data from sender\n");

    // Initialize socket address structure for Internet Protocols
    ZeroMemory(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(port);
    sin_len = sizeof(sin);

    //Create a UDP socket and bind it to the port
    socket_descrīptor = socket(AF_INET, SOCK_DGRAM, 0);
    bind(socket_descrīptor, (struct sockaddr *)&sin, sizeof(sin));
    
    //Loop forever (or until a termination message is received)
    // Received data through the socket and process it.The processing in this program is really simple --printing
    while(1)
    {
        recvfrom(socket_descrīptor, message, sizeof(message), 0, (struct sockaddr *)&sin, &sin_len);
        printf("Response from server : %s\n", message);
        if(strncmp(message, "stop", 4) == 0)
        {
            printf("sender has told me to end the connection\n");
            
        }
    } 
    WSACleanup();
    return 0;
}
可以局域网通信,但转到广域网之后就不行了,麻烦那位高人帮我改改可以吗
starytx 2013-06-24
  • 打赏
  • 举报
回复
这个就跟你收发快递类似,你只需关心附近的收发点写清楚你的目的地就可以了,具体怎么走就是快递公司的事了。
有新工作否 2013-06-24
  • 打赏
  • 举报
回复
这个是网络工程师干的事,跟你没有关系,对你来说,能ping通对方ip地址就可以了,其他的跟局域网一回事。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧