
为什么C++写的Socket 编程 没用呢
我做的是一个控制台程序写好后我把程序发给我局域网内的朋友测试但是没效果我本地测试就对代码如下:服务端:==================================...
我做的是一个控制台程序
写好后 我把程序 发给我 局域网内的朋友 测试 但是 没效果
我本地测试 就对
代码如下:
服务端:==============================================
#include<iostream>
#include<Winsock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1){
WSACleanup( );
return;
}
SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
recvfrom(socketSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if('q'==recvBuf[0])
{
sendto(socketSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
printf("推出了\n");
break;
}
sprintf(tempBuf,"%s 说:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("请你说:\n");
gets(sendBuf);
sendto(socketSrv,sendBuf,100,0,(SOCKADDR*)&addrClient,len);
}
closesocket(socketSrv);
WSACleanup( );
}
客户端:======================================
#include<iostream>
#include<Winsock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1){
WSACleanup( );
return;
}
SOCKET socketClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
int len = sizeof(SOCKADDR);
while(1)
{
printf("请输入东西:\n");
gets(sendBuf);
sendto(socketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
recvfrom(socketClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
if('q'==recvBuf[0])
{
sendto(socketClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);
printf("Chat end\n");
break;
}
sprintf(tempBuf,"%s 说:%s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s",tempBuf);
}
closesocket(socketClient);
WSACleanup( );
} 展开
写好后 我把程序 发给我 局域网内的朋友 测试 但是 没效果
我本地测试 就对
代码如下:
服务端:==============================================
#include<iostream>
#include<Winsock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1){
WSACleanup( );
return;
}
SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
recvfrom(socketSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if('q'==recvBuf[0])
{
sendto(socketSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
printf("推出了\n");
break;
}
sprintf(tempBuf,"%s 说:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("请你说:\n");
gets(sendBuf);
sendto(socketSrv,sendBuf,100,0,(SOCKADDR*)&addrClient,len);
}
closesocket(socketSrv);
WSACleanup( );
}
客户端:======================================
#include<iostream>
#include<Winsock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1){
WSACleanup( );
return;
}
SOCKET socketClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
int len = sizeof(SOCKADDR);
while(1)
{
printf("请输入东西:\n");
gets(sendBuf);
sendto(socketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
recvfrom(socketClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
if('q'==recvBuf[0])
{
sendto(socketClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);
printf("Chat end\n");
break;
}
sprintf(tempBuf,"%s 说:%s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s",tempBuf);
}
closesocket(socketClient);
WSACleanup( );
} 展开
4个回答
展开全部
局域网测试没问题,外网测试有问题,这个很能说明问题
你在内网,客户端访问服务端的6000端口是可达的,但是访问外网就不一样了,数据会到达直接连接外网的路由器,路由器才是实际外网地址对应的终端。
所以说,你要想使用外网地址可以访问,那么你要把路由器上的对应端口映射到你机器监听的那个端口上。
例如,在路由上将端口M映射到本地端口N上,你在本地运行服务器监听端口N,客户端连接外网地址的M端口就可以完成访问了,也就是说M和N的值可以不同,你要把数据的走向分析清楚,那问题也就迎刃而解了。
============================
希望我的回答能够对你有所帮助
你在内网,客户端访问服务端的6000端口是可达的,但是访问外网就不一样了,数据会到达直接连接外网的路由器,路由器才是实际外网地址对应的终端。
所以说,你要想使用外网地址可以访问,那么你要把路由器上的对应端口映射到你机器监听的那个端口上。
例如,在路由上将端口M映射到本地端口N上,你在本地运行服务器监听端口N,客户端连接外网地址的M端口就可以完成访问了,也就是说M和N的值可以不同,你要把数据的走向分析清楚,那问题也就迎刃而解了。
============================
希望我的回答能够对你有所帮助
追问
那我程序的客户端 那些 IP地址要怎么写呢??
追答
服务器的地址始终给INADDR_ANY就可以了,系统会自动使用本机可用地址填充
如果映射打开了,那就把客户端的换成外网地址、端口换为被映射端口
展开全部
客户端 服务器程序中的地址改对了吗?
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2"); ??
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.2"); ??
追问
你好 改对了 局域网和 本地都可以 但是
我用外网IP 就不行了 外网IP 是 222.128.151.233 这样的 连起服务器都 不行 就有错误
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
wVersionRequested = MAKEWORD(1,1);
改为wVersionRequested = MAKEWORD(2,2);
在程序前面加上下面这句:
#pragma comment(lib, "ws2_32.lib")
改为wVersionRequested = MAKEWORD(2,2);
在程序前面加上下面这句:
#pragma comment(lib, "ws2_32.lib")
追问
改为wVersionRequested = MAKEWORD(2,2);
是调用版本 2,2
但是 #pragma comment(lib, "ws2_32.lib") 不懂
还要就是这个加什么位置??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果说192.168.0.2是你的ip,那么
1.确定你的朋友和你在一个局域网
2.确定你的防火墙已经关闭
1.确定你的朋友和你在一个局域网
2.确定你的防火墙已经关闭
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询