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

我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(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);
  
 

你可能感兴趣的:(如何在socket 程序中绑定本地端口)