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

 我来答
wgdzkx
2017-01-24 · TA获得超过659个赞
知道小有建树答主
回答量:741
采纳率:13%
帮助的人:254万
展开全部
我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(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 就更简单了
下边是代码片段
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
oj...p@163.com
2017-01-24 · TA获得超过780个赞
知道小有建树答主
回答量:749
采纳率:0%
帮助的人:108万
展开全部
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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式