Socket Client和Server在自己電腦上都能連接成功,但換成兩臺電腦就連不上了:
代碼:
Client:
#include <winsock2.h>
#include <iostream>
using namespace std;
int main()
{
WSADATA wsaData;
SOCKET client;
SOCKADDR_IN addr ;
char buf[128];
if(WSAStartup(0x202,&wsaData)!=0)
{
cout<<"initiate Winsock DLL erro"<<endl;
return -1;
}
client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
cout<<"Server IP:";
cin.getline(buf,128,'\n');
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(buf);
addr.sin_port=htons(6666);
if(connect(client,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
{
cout<<"connect failed"<<WSAGetLastError()<<endl;
WSACleanup();
return -1;
}
else cout<<"連接成功"<<endl;
while(1)
{
cin.getline(buf,128,'\n');
if (strcmp(buf,"quit")==0) break;
send(client,buf,sizeof(buf),0);
if(recv(client,buf,sizeof(buf),0)>0)
{
cout<<buf<<endl;
memset(buf,0,128);
}
}
closesocket(client);
WSACleanup();
return 0;
}
Server:
#include <iostream>
#include <winsock2.h>
using namespace std;
int main()
{
WSADATA wsaData;
PHOSTENT hostinfo;
SOCKET server,accSock;
SOCKADDR_IN addr,addrout;
int port,len=sizeof( SOCKADDR);
char buf[128],*ip;
if (WSAStartup(0x202,&wsaData)!=0)
{
cout<<"error"<<endl;
return -1;
}
server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr= htonl(INADDR_ANY);
addr.sin_port=htons(6666);
bind(server,(SOCKADDR*)&addr,sizeof(addr));
gethostname(buf,sizeof(buf));
hostinfo=gethostbyname(buf);
ip=inet_ntoa(*(IN_ADDR*)*hostinfo->h_addr_list);
listen(server,1);
cout<<"接收端:"<<ip<<"等待連接"<<endl;
accSock=accept(server,(SOCKADDR*)&addrout,&len);
ip=inet_ntoa(addrout.sin_addr);
port=htons(addrout.sin_port);
cout<<"發送端:"<<ip<<":"<<port<<endl;
while(1)
{int flag=0;
flag=recv(accSock,buf,sizeof(buf),0);
if(flag>0)
{
cout<<buf<<endl;
cin.getline(buf,128);
send(accSock,buf,sizeof(buf),0);
memset(buf,0,128);
}
if (strcmp(buf,"quit")==0) break;
}
closesocket(accSock);
closesocket(server);
WSACleanup();
return 0;
}
uj5u.com熱心網友回復:
如果 Server 和 Client 不是在同一個網段的局域網內,可能需要填外網IP 而且要服務端的埠可被訪問到uj5u.com熱心網友回復:
防火墻設定!!!uj5u.com熱心網友回復:
connect連接失敗,請查看一下WSAGetLastError()的回傳值是什么。uj5u.com熱心網友回復:
看看客戶端iP設定是否正確uj5u.com熱心網友回復:
一個局域網通信的話,那么就要看具體的錯誤資訊,是否機器上有防火墻等攔截處理uj5u.com熱心網友回復:
客戶端connect后錯誤碼多少?10054 ? 10061?
先查網路是否正常,再查防火墻
uj5u.com熱心網友回復:
你的ip有問題,你在client寫的關于ip的函式感覺是獲得客戶端本機的ip地址,不是獲得服務器的地址,所以你在同一臺機器上沒問題,在兩臺機器上有問題uj5u.com熱心網友回復:
兩臺電腦如果是在同一局域網內,關閉防火墻即可,如果是公網,需要做埠映射uj5u.com熱心網友回復:
1.試試看ip能不能ping通2.connect回傳錯誤,使用GetWSALastError回傳錯誤碼看下。
uj5u.com熱心網友回復:
沒有吧 他是要輸入服務器的IP地址的。
估計防火墻的原因最大。本機電腦怎么搞都行,別人哪能隨便搞。
uj5u.com熱心網友回復:
樓主為什么我用你的通信不了 馬上要交作業了 能辦我看看嘛 我QQ1269766840 求啊uj5u.com熱心網友回復:
自己電腦連接與兩臺電腦連接最大的區別就是IP不同,本機為127.0.0.1,而我很好奇,你兩機之間的IP是如何設定的?
uj5u.com熱心網友回復:
那如果是兩臺電腦之間,IP如何設定呢?
uj5u.com熱心網友回復:
addr.sin_family=AF_INET;addr.sin_addr.s_addr=inet_addr(buf);
addr.sin_port=htons(6666);
if(connect(client,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
單步除錯,檢查服務端IP地址,檢查防火墻設定
uj5u.com熱心網友回復:
Socket Client和Server在自己電腦上都能連接成功,但換成兩臺電腦就連不上了:
自己電腦連接與兩臺電腦連接最大的區別就是IP不同,本機為127.0.0.1,而我很好奇,你兩機之間的IP是如何設定的?
那如果是兩臺電腦之間,IP如何設定呢?
先檢查確定網路環境,兩臺電腦是否在一個網段,電腦的本地策略是否設定了訪問許可等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130527.html
標籤:網絡編程
上一篇:mfc開發的ocx如何給欄位分類
下一篇:請教多執行緒問題
