如何在socket 程序中绑定本地端口
2个回答
展开全部
我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(client)源端口。我还是头一看到非要限制源端口的设备,虽然我认为这样会造成连接的不稳定,比如网络中断引起重新连接一定会导致本地端口的占用,此时只有等待超时端口被回收。否则将一直是port or address in use错误。可能需要复杂的机制来管理连接,以下是一个简单的socket 测试程序。
#include<stdio.h#include<sys/types.h#include<sys/socket.h#include<netinet/in.h#include<netdb.hvoiderror(char*msg){perror(msg);exit(0);}intmain(intargc,
char*argv[]){intsockfd,portno,lportno,n;structsockaddr_inserv_addr;structsockaddr_inclient_addr;structhostent*server;charbuffer[256];if(argc<3){fprintf(stderr,
usage%shostnameportLocalPort
,argv[0]);exit(0);}portno=atoi(argv[2]);sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0)error(
ERRORopeningsocket);bzero((char*)&client_addr,
sizeof(client_addr));lportno=atoi(argv[3]);client_addr.sin_family=AF_INET;client_addr.sin_addr.s_addr=INADDR_ANY;
client_addr.sin_port=htons(lportno);if(bind(sockfd,(
structsockaddr*)&client_addr,sizeof(client_addr))<0)error(
ERRORonbinding);server=gethostbyname(argv[1]);if(server==NULL){fprintf(stderr,
ERROR,nosuchhost);exit(0);}bzero((char*)&serv_addr,
sizeof(serv_addr));
serv_addr.sin_family=AF_INET;bcopy((char*)server-h_addr,(char*)&serv_addr.sin_addr.s_addr,
server-h_length);serv_addr.sin_port=htons(portno);if(connect(sockfd,
&serv_addr,
sizeof(serv_addr))<0)error(
ERRORconnecting);printf(
Pleaseenterthemessage:);bzero(buffer,
256);fgets(buffer,
255
,stdin);n=write(sockfd,buffer,strlen(buffer));if(n<0)error(
ERRORwritingtosocket);bzero(buffer,
256);n=read(sockfd,buffer,
255);if(n<0)error(
ERRORreadingfromsocket);printf(%s
,buffer);return0;}只要是bind函数的使用,发现一些人总认为bind只能应用到server程序。这是不对的。在connect的时候如果不指定端口号,系统会自动分配空闲的。但是99.9的程序都不关心本地端口号。所以很少有这么使用的。
至于java 就更简单了
下边是代码片段
#include<stdio.h#include<sys/types.h#include<sys/socket.h#include<netinet/in.h#include<netdb.hvoiderror(char*msg){perror(msg);exit(0);}intmain(intargc,
char*argv[]){intsockfd,portno,lportno,n;structsockaddr_inserv_addr;structsockaddr_inclient_addr;structhostent*server;charbuffer[256];if(argc<3){fprintf(stderr,
usage%shostnameportLocalPort
,argv[0]);exit(0);}portno=atoi(argv[2]);sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0)error(
ERRORopeningsocket);bzero((char*)&client_addr,
sizeof(client_addr));lportno=atoi(argv[3]);client_addr.sin_family=AF_INET;client_addr.sin_addr.s_addr=INADDR_ANY;
client_addr.sin_port=htons(lportno);if(bind(sockfd,(
structsockaddr*)&client_addr,sizeof(client_addr))<0)error(
ERRORonbinding);server=gethostbyname(argv[1]);if(server==NULL){fprintf(stderr,
ERROR,nosuchhost);exit(0);}bzero((char*)&serv_addr,
sizeof(serv_addr));
serv_addr.sin_family=AF_INET;bcopy((char*)server-h_addr,(char*)&serv_addr.sin_addr.s_addr,
server-h_length);serv_addr.sin_port=htons(portno);if(connect(sockfd,
&serv_addr,
sizeof(serv_addr))<0)error(
ERRORconnecting);printf(
Pleaseenterthemessage:);bzero(buffer,
256);fgets(buffer,
255
,stdin);n=write(sockfd,buffer,strlen(buffer));if(n<0)error(
ERRORwritingtosocket);bzero(buffer,
256);n=read(sockfd,buffer,
255);if(n<0)error(
ERRORreadingfromsocket);printf(%s
,buffer);return0;}只要是bind函数的使用,发现一些人总认为bind只能应用到server程序。这是不对的。在connect的时候如果不指定端口号,系统会自动分配空闲的。但是99.9的程序都不关心本地端口号。所以很少有这么使用的。
至于java 就更简单了
下边是代码片段
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询