免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10470 | 回复: 8
打印 上一主题 下一主题

socket程序,客户端的端口不能固定吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-21 22:36 |只看该作者 |倒序浏览
不好意思,最近才发现在这样以下经典的客户端程序里,实际上客户端用哪个端口发送数据是不固定,是由系统分配的(当然向服务器哪个端口发送是固定的),
我的程序在ontimer下多次执行类似的代码,发现系统分配的端口是在一个范围内循环的,不同机器不一样。可是有的时候段系统分配的端口似乎有问题,server端向该端口发送数据会被防火墙拦截住,好像这个端口不太安全?这是怎么回事呀?
能让客户端用固定端口发送数据吗?
还请大家帮帮忙!

  WSADATA wsaData;
   WORD version=MAKEWORD(2,0);
   int ret=WSAStartup(version,&wsaData);
   unsigned long uladdr;           
   uladdr=inet_addr(argv[1]);            //服务器地址
   
   sock=socket(AF_INET, SOCK_STREAM,0);  //建立套接字   
   server.sin_family=AF_INET;
   server.sin_port=htons(atoi(argv[2]));
   server.sin_addr.S_un.S_addr=uladdr;  //服务器ip地址
   
   connect(sock,(const sockaddr*)&server,sizeof(server))         
   
   memset(buf,0,sizeof(buf));
   printf("begin to recv\n";
   rval=recv(sock,buf,1024,0);       //没有说用那个端口接数据,系统分配
   closesocket(sock);

论坛徽章:
0
2 [报告]
发表于 2004-08-22 10:49 |只看该作者

socket程序,客户端的端口不能固定吗?

版主,各位大侠,能帮忙回答一下吗?我实在挺郁闷的

论坛徽章:
0
3 [报告]
发表于 2004-08-22 13:07 |只看该作者

socket程序,客户端的端口不能固定吗?

你的服务器分配端口是不是有放火墙屏蔽的端口?

论坛徽章:
0
4 [报告]
发表于 2004-08-22 15:02 |只看该作者

socket程序,客户端的端口不能固定吗?

有的机器系统分给客户端的端口会出现1243之类的,每到这个时候,客户端防火墙就会把服务器端向这个端口发的数据包拦截掉,我用的是瑞星的防火墙,这规则不是我加的

论坛徽章:
0
5 [报告]
发表于 2004-08-22 17:01 |只看该作者

socket程序,客户端的端口不能固定吗?

一般来说,端口1024以内为系统使用,之后为系统为客户程序分配使用(一般为系统随机分配),但是通信一旦建立后,端口号就固定了。
   至于采用固定端口,下面有一个程序不知道你是否满意:

Client

int sock_connect(char *domain,int port)

{

int white_sock;

struct hostent * site;

struct sockaddr_in me;

site = gethostbyname(domain);

if (site==NULL) return -2;

white_sock = socket(AF_INET,SOCK_STREAM,0);

if (white_sock<0) return -1;

memset(&me,0,sizeof(struct sockaddr_in));

memcpy(&me.sin_addr,site->;h_addr_list[0],site->;h_length);

me.sin_family = AF_INET;
me.sin_port = htons(port);

return (connect(white_sock,(struct sockaddr *)&me,
            sizeof(struct sockaddr))<0) ? -1 : white_sock;

}

论坛徽章:
0
6 [报告]
发表于 2004-08-23 08:55 |只看该作者

socket程序,客户端的端口不能固定吗?

...
socket()
bind()
// Many people ignore bind() while coding tcp client. It's OK but port is dynamic.

connect()
...

论坛徽章:
0
7 [报告]
发表于 2004-08-23 09:02 |只看该作者

socket程序,客户端的端口不能固定吗?

用bind()绑定套节子和端口

论坛徽章:
0
8 [报告]
发表于 2004-08-23 09:35 |只看该作者

socket程序,客户端的端口不能固定吗?

bind(sock,(struct sockaddr *)&server,sizeof(server));?

没有用啊,server里装得是服务器的信息

事情是这样的:
我在客户端每隔5秒执行以下程序:

   sock=socket(AF_INET, SOCK_STREAM,0);
   server.sin_family=AF_INET;
   server.sin_port=htons(atoi(argv[2]));
   server.sin_addr.S_un.S_addr=uladdr;  //服务器ip地址
   
   connect(sock,(const sockaddr*)&server,sizeof(server))         
  
   memset(buf,0,sizeof(buf));
   printf("begin to recv\n";
   rval=recv(sock,buf,1024,0);
   closesocket(sock);

在服务器端写
      msgsock=accept(sock,(struct sockaddr*)&tcpaddr,(int *)&len)
         printf("client ip=%s\n ",inet_ntoa(tcpaddr.sin_addr));

  看到客户端系统给客户端分配的端口(tcpaddr.sin_addr)在不停的变化(大概是因为每次连接都新建了一个套接字?),一旦看到客户端系统给客户端分配的端口(tcpaddr.sin_addr)在不停的变化,一旦tcpaddr.sin_addr=1243的时候,客户端的防火墙就会把服务器发来的数据包拦截的,导致通讯中断,把防火墙关掉后客户端才能用这个端口.
      请问是不是能够让tcpaddr.sin_addr固定下来?这样是不是就不会出错了?

多谢各位

论坛徽章:
0
9 [报告]
发表于 2004-08-23 11:30 |只看该作者

socket程序,客户端的端口不能固定吗?

我明白了,谢谢各位相助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP