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



































































只要是bind函数的使用,发现一些人总认为bind只能应用到server程序。这是不对的。在connect的时候如果不指定端口号,系统会自动分配空闲的。但是99.9的程序都不关心本地端口号。所以很少有这么使用的。
至于java 就更简单了
下边是代码片段
socket = new Socket("10.254.192.169", 80, InetAddress.getLocalHost(), 6001);
版权声明:本文为hadelu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。