诚心求教为什么socket远程连接不通,只能本地连接?

qqxufo 2014-01-22 04:49:30
求高手帮帮忙啊,我的客户端和服务器只能在同一台机器上使用,客户端在别人的机子就连不到我的服务器了。不是只要在客户端设置好their_addr.sin_addr.s_addr= inet_addr("服务器ip");就可以了吗?
还有一个问题就是,我的客户端只能联通服务器一次,连通完之后就,第二次循环就不能再次连上了。
本人是个新手,自己弄了好几天都弄不出来,真心求解,求哪位大神帮下忙,真的感激不尽。


//服务器
#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>

#define MYPORT 4000
#define BACKLOG 5
#define MAXDATASIZE 100

int main()
{
WSADATA wsaData;
//初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
int sockfd,newfd;
int sin_size, numbytes;

SOCKADDR_IN my_addr;
SOCKADDR_IN their_addr;
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
ZeroMemory(&(my_addr.sin_zero), 8);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
{
perror("socket");
exit(1);
}
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==SOCKET_ERROR)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==SOCKET_ERROR)
{
perror("listen");
exit(1);
}
char recvbuf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];

while(1)
{
printf("\n~~~~~~~等待连接~~~~~~~\n\n");
sin_size=sizeof(struct sockaddr_in);
if((newfd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==SOCKET_ERROR)
{
perror("accept");
continue;
}

printf("服务器已连接\n");
printf("请输入:");



ZeroMemory(sendbuf,MAXDATASIZE);
gets(sendbuf);

if(send(newfd,sendbuf,sizeof(sendbuf),0)==SOCKET_ERROR){
perror("send");
exit(0);
}

numbytes = recv(newfd, recvbuf, MAXDATASIZE, 0);

recvbuf[numbytes] = '\0';

printf("对方回应: %s",recvbuf);
closesocket(newfd);


}
return 0;
}




//客户端
#include<winsock2.h>
#include<stdio.h>
#include<string.h>

#define PORT 4000
#define MAXDATASIZE 100

int main()
{

WSADATA wsaData;
//初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
int sockfd,numbytes;
struct hostent *he;
struct sockaddr_in their_addr;
char ServerName[128];
gethostname(ServerName, 128);
he = gethostbyname(ServerName);

sockfd=socket(AF_INET,SOCK_STREAM,0);

their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);
their_addr.sin_addr= *((struct in_addr *)he->h_addr);
their_addr.sin_addr.s_addr= inet_addr("123.67.189.18");
ZeroMemory(&(their_addr.sin_zero), 8);

char recvbuf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];


while(1)
{
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==SOCKET_ERROR)
{
perror("connect");
continue;
}

numbytes=recv(sockfd,recvbuf,MAXDATASIZE,0);
if(numbytes==SOCKET_ERROR)
{
perror("recv");
break;
}
recvbuf[numbytes]='\0';
printf("Received: %s\n",recvbuf);
printf("please write:");
ZeroMemory(sendbuf,sizeof(sendbuf));
gets(sendbuf);
printf("\n");

if(send(sockfd,sendbuf,MAXDATASIZE,0)==SOCKET_ERROR)
{
perror("send");
break;
}

}
closesocket(sockfd);

return 0;

}

...全文
646 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2014-01-23
  • 打赏
  • 举报
回复
除了上面大家说的问题以外 123.67.189.18 这个值会经常变的。要去专门的网页上查的
oyljerry 2014-01-23
  • 打赏
  • 举报
回复
引用 11 楼 u013539441 的回复:
[quote=引用 9 楼 xiaoc1026 的回复:] [quote=引用 8 楼 u013539441 的回复:] [quote=引用 7 楼 xiaoc1026 的回复:] [quote=引用 6 楼 u013539441 的回复:] [quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通 [/quote] 出现了这个:不能打开到主机的连接,在端口80:连接失败 还有一个问题就是,只要服务器的端口打开就行了吗?客户端不需要打开相应端口吗?[/quote] 客户端就是你本机了,本机电脑XP或WIN7防火墙一般不会现在网络访问。你还是把服务器防火墙关闭了吧。[/quote] 我发现不是防火墙的问题 我刚才测试的都是外省的机子,所以都连不通,我试省内的是可以用的,为什么啊?[/quote] 机器是否有独立IP。如果在路由器后面,需要路由器做端口映射等。
谁学逆向工程 2014-01-23
  • 打赏
  • 举报
回复
你的服务器程序是不是在NAT后面?
噜sir 2014-01-23
  • 打赏
  • 举报
回复
我自己做的程序,是先解析域名(比如解析www.baidu.com),然后获得IP,设置的端口号一般在80段,如8080。后面的,Client访问请求,Server侦听,blablabla的参考一般教程就行了。
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
引用 9 楼 xiaoc1026 的回复:
[quote=引用 8 楼 u013539441 的回复:] [quote=引用 7 楼 xiaoc1026 的回复:] [quote=引用 6 楼 u013539441 的回复:] [quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通 [/quote] 出现了这个:不能打开到主机的连接,在端口80:连接失败 还有一个问题就是,只要服务器的端口打开就行了吗?客户端不需要打开相应端口吗?[/quote] 客户端就是你本机了,本机电脑XP或WIN7防火墙一般不会现在网络访问。你还是把服务器防火墙关闭了吧。[/quote] 我发现不是防火墙的问题 我刚才测试的都是外省的机子,所以都连不通,我试省内的是可以用的,为什么啊?
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
引用 9 楼 xiaoc1026 的回复:
[quote=引用 8 楼 u013539441 的回复:] [quote=引用 7 楼 xiaoc1026 的回复:] [quote=引用 6 楼 u013539441 的回复:] [quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通 [/quote] 出现了这个:不能打开到主机的连接,在端口80:连接失败 还有一个问题就是,只要服务器的端口打开就行了吗?客户端不需要打开相应端口吗?[/quote] 客户端就是你本机了,本机电脑XP或WIN7防火墙一般不会现在网络访问。你还是把服务器防火墙关闭了吧。[/quote] 大神,我连接我家楼上的机器是可以连通的,但是换到浙江那边的机子就通不了了,为什么啊?
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
引用 8 楼 u013539441 的回复:
[quote=引用 7 楼 xiaoc1026 的回复:] [quote=引用 6 楼 u013539441 的回复:] [quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通 [/quote] 出现了这个:不能打开到主机的连接,在端口80:连接失败 还有一个问题就是,只要服务器的端口打开就行了吗?客户端不需要打开相应端口吗?[/quote] 客户端就是你本机了,本机电脑XP或WIN7防火墙一般不会现在网络访问。你还是把服务器防火墙关闭了吧。
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
引用 7 楼 xiaoc1026 的回复:
[quote=引用 6 楼 u013539441 的回复:] [quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通 [/quote] 出现了这个:不能打开到主机的连接,在端口80:连接失败 还有一个问题就是,只要服务器的端口打开就行了吗?客户端不需要打开相应端口吗?
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
引用 6 楼 u013539441 的回复:
[quote=引用 5 楼 xiaoc1026 的回复:] [quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?[/quote] 你可以在命令行输入: telnet 服务器IP 80 看下服务器端口通不通
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
引用 5 楼 xiaoc1026 的回复:
[quote=引用 4 楼 u013539441 的回复:] [quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。[/quote] 我使用了80端口之后,两台机器还是连不通啊,还是只能在一台机器上连,这是什么原因啊?
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
引用 4 楼 u013539441 的回复:
[quote=引用 3 楼 xiaoc1026 的回复:] [quote=引用 2 楼 u013539441 的回复:] 额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote] 关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗? 有没有什么通用的端口可以代替4000啊。。我是新手,问题有点多了,麻烦解答一下[/quote] 你在命令行使用netstat -na 查看到的端口状态是应用程序的端口链接状态,如果防火墙拦截了端口访问,那么你客户端就链接不到服务器,所以你可以关闭防火墙后调试程序。至于通用端口,一般服务器都会开放 80端口,你可以试试。
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
引用 3 楼 xiaoc1026 的回复:
[quote=引用 2 楼 u013539441 的回复:]
额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了


这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了![/quote]
关掉之后就可以了吗?我在命令行里看到的4000端口是*:*状态啊,关掉防火墙之后就会自动打开端口吗?
有没有什么通用的端口可以代替4000啊。我是新手,问题有点多了,麻烦解答一下
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
引用 2 楼 u013539441 的回复:
额,我用的是win8的系统,不会怎么看啊。。求方法,谢谢了
这个简单,打开控制面板-》检查防火墙状态-》打开或关闭防火墙 ,然后关闭防火墙就好了!
qqxufo 2014-01-22
  • 打赏
  • 举报
回复
额,我用的是win8的系统,不会怎么看啊。求方法,谢谢了
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
服务器上需要开放 4000 端口才能连接,你看下服务器上防火墙,TCP筛选器是否有限制端口

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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