C 在初始化套接字时选择一个随机端口
我尝试创建要连接到服务器的套接字,每当我运行此代码时,进程都尝试连接到随机套接字。 使用以下参数调用该函数:C 在初始化套接字时选择一个随机端口,c,linux,sockets,port,C,Linux,Sockets,Port,我尝试创建要连接到服务器的套接字,每当我运行此代码时,进程都尝试连接到随机套接字。 使用以下参数调用该函数: int create_socket(struct in_addr *ip, unsigned int port) { int s = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_I
int create_socket(struct in_addr *ip, unsigned int port) {
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = (port);
sin.sin_addr.s_addr = ip;
connect(s, &sin, sizeof(sin));
return s;
}
有人检测到错误吗?请尝试以下方法:
int-create\u-socket(地址*ip中的结构,无符号短端口){
int s=套接字(AF_INET,SOCK_STREAM,0);
如果(s<0)返回-1;
sin中的结构sockaddr_;
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin\u addr.s\u addr=ip->s\u addr;
如果(连接(s,&sin,sizeof(sin))<0){
关闭(s);;
s=-1;
}
返回s;
}
地址ip中的结构;
inet_aton(argv[1],&ip)//argv[1]=“127.0.0.1”
无符号短端口=atoi(argv[2])//argv[2]=“8080”
int sckt=创建_套接字(&ip,端口);
if(sckt<0){
...
}
否则{
...
关闭(sckt);
}
更好的选择是使用,让它在中为您完成sockaddr_的所有解析和设置:
int创建_套接字(常量字符*ip,常量字符*端口){
结构addrinfo提示,*addrs,*addr;
memset(&hints,0,sizeof(hints));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
int res=getaddrinfo(ip、端口、提示和地址);
如果(res<0){
返回-1;
}
for(addr=addrs;addr!=NULL;addr=addr->ai_next){
int s=socket(地址->ai_族,地址->ai_socktype,地址->ai_协议);
如果(s<0)继续;
如果(连接(s,地址->人工智能地址,地址->人工智能地址)=0){
freeaddrinfo(addrs);
返回s;
}
关闭(s);;
}
freeaddrinfo(addrs);
返回-1;
}
int-sckt=create_套接字(argv[1],argv[2]);
if(sckt<0){
...
}
否则{
...
关闭(sckt);
}
尝试类似以下内容:
int-create\u-socket(地址*ip中的结构,无符号短端口){
int s=套接字(AF_INET,SOCK_STREAM,0);
如果(s<0)返回-1;
sin中的结构sockaddr_;
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin\u addr.s\u addr=ip->s\u addr;
如果(连接(s,&sin,sizeof(sin))<0){
关闭(s);;
s=-1;
}
返回s;
}
地址ip中的结构;
inet_aton(argv[1],&ip)//argv[1]=“127.0.0.1”
无符号短端口=atoi(argv[2])//argv[2]=“8080”
int sckt=创建_套接字(&ip,端口);
if(sckt<0){
...
}
否则{
...
关闭(sckt);
}
更好的选择是使用,让它在中为您完成sockaddr_的所有解析和设置:
int创建_套接字(常量字符*ip,常量字符*端口){
结构addrinfo提示,*addrs,*addr;
memset(&hints,0,sizeof(hints));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
int res=getaddrinfo(ip、端口、提示和地址);
如果(res<0){
返回-1;
}
for(addr=addrs;addr!=NULL;addr=addr->ai_next){
int s=socket(地址->ai_族,地址->ai_socktype,地址->ai_协议);
如果(s<0)继续;
如果(连接(s,地址->人工智能地址,地址->人工智能地址)=0){
freeaddrinfo(addrs);
返回s;
}
关闭(s);;
}
freeaddrinfo(addrs);
返回-1;
}
int-sckt=create_套接字(argv[1],argv[2]);
if(sckt<0){
...
}
否则{
...
关闭(sckt);
}
问题在于:
inet_aton(argv[1], &ip); //argv[1]=='127.0.0.1'
unsigned int port = htons(atoi(argv[2])); //argv[2]=='8080'
问题在于:
inet_aton(argv[1], &ip); //argv[1]=='127.0.0.1'
unsigned int port = htons(atoi(argv[2])); //argv[2]=='8080'
真正的问题是什么?客户端将使用一个随机端口,该端口高于众所周知的最低阈值。服务器仍应使用指定的侦听端口。如果您希望客户端使用为服务器端指定的相同端口客户端连接到服务器,则connect
并非如此。@WhozCraig我相信他希望连接到指定端口8080,而不是随机端口。@correct答案不会改变我说的话,也不会改变我问的问题,一点也不。你怎么知道它要连接到哪个端口呢?@CraigEstey8080
的十六进制是0x1F90
,所以进行尾端交换意味着它应该是0x901F
,也就是36895
,假设它在整个过程中都是无符号的-但是使用无符号int
而不是正确的无符号short
确实有一种讨厌的代码味道,所以我想知道遗漏了什么。但是从一开始就确保值是正确的肯定是一个好主意,因为使用atoi()
只会增加气味。确切的实际问题是什么?客户端将使用一个随机端口,该端口高于众所周知的最低阈值。服务器仍应使用指定的侦听端口。如果您希望客户端使用为服务器端指定的相同端口客户端连接到服务器,则connect
并非如此。@WhozCraig我相信他希望连接到指定端口8080,而不是随机端口。@correct答案不会改变我说的话,也不会改变我问的问题,一点也不。你怎么知道它要连接到哪个端口呢?@CraigEstey8080
的十六进制是0x1F90
,所以进行尾端交换意味着它应该是0x901F
,也就是36895
,假设它在整个过程中都是无符号的-但是使用无符号int
而不是正确的无符号short
确实有一种讨厌的代码味道,所以我想知道遗漏了什么。但是从一开始就确保值是正确的肯定是个好主意,因为使用atoi()
只会增加气味。