如何在socket 程序中绑定本地端口

这篇博客介绍了如何在socket程序中绑定本地端口,以应对特定场景如与安全限制的设备连接。文章通过一个简单的C语言示例展示了如何在客户端程序中使用bind函数指定本地端口,并解释了不指定本地端口时系统的行为。此外,还提及了Java中设置本地端口的简便方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(client)源端口。我还是头一看到非要限制源端口的设备,虽然我认为这样会造成连接的不稳定,比如网络中断引起重新连接一定会导致本地端口的占用,此时只有等待超时端口被回收。否则将一直是port or address in use错误。可能需要复杂的机制来管理连接,以下是一个简单的socket 测试程序。
#include  < stdio.h >
#include 
< sys / types.h >
#include 
< sys / socket.h >
#include 
< netinet / in .h >
#include 
< netdb.h >

void  error( char   * msg)
{
        perror(msg);
        exit(
0);
}


int  main( int  argc,  char   * argv[])
{
        
int sockfd, portno, lportno,n;
        
struct sockaddr_in serv_addr;
        
struct sockaddr_in client_addr;
        
struct hostent *server;

        
char buffer[256];
        
if (argc < 3{
                fprintf(stderr,
"usage %s hostname port LocalPort  ", argv[0]);
                exit(
0);
        }

        portno 
= atoi(argv[2]);
        sockfd 
= socket(AF_INET, SOCK_STREAM, 0);
        
if (sockfd < 0)
                error(
"ERROR opening socket");


        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, (struct sockaddr *&client_addr,
                                
sizeof(client_addr)) < 0)
                error(
"ERROR on binding");



        server 
= gethostbyname(argv[1]);
        
if (server == NULL) {
                fprintf(stderr,
"ERROR, no such host ");
                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(
"ERROR connecting");
        printf(
"Please enter the message: ");
        bzero(buffer,
256);
        fgets(buffer,
255,stdin);
        n 
= write(sockfd,buffer,strlen(buffer));
        
if (n < 0)
                error(
"ERROR writing to socket");
        bzero(buffer,
256);
        n 
= read(sockfd,buffer,255);
        
if (n < 0)
                error(
"ERROR reading from socket");
        printf(
"%s ",buffer);
        
return 0;
}

只要是bind函数的使用,发现一些人总认为bind只能应用到server程序。这是不对的。在connect的时候如果不指定端口号,系统会自动分配空闲的。但是99.9的程序都不关心本地端口号。所以很少有这么使用的。
至于java 就更简单了
下边是代码片段
            socket = new Socket("10.254.192.169", 80, InetAddress.getLocalHost(), 6001);
  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值