我需要将客户端绑定到特定端口,然后连接到其服务器。问题是如果我成功绑定到给定端口但无法连接到服务器。如果我不尝试绑定到端口,我可以连接到服务器。以下是我的计划:
int main()
{
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr,client_addr;
host = gethostbyname("127.0.0.1");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket");
exit(1);
}
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(4000);
client_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(client_addr.sin_zero),8);
//host = gethostbyname("192.168.61.67");
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(2404);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (bind(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr))== -1)
{
perror("Unable to bind");
exit(1);
}
else
{
fprintf(stderr,"Client bound to 4000\n");
}
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
perror("Connect");
exit(1);
}
else
{
printf("Connected to the server\n");
}
while(1)
{
bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
{
close(sock);
break;
}
else
printf("\nRecieved data = %s " , recv_data);
printf("\nSEND (q or Q to quit) : ");
gets(send_data);
if (strcmp(send_data , "q") != 0 && strcmp(send_data , "Q") != 0)
send(sock,send_data,strlen(send_data), 0);
else
{
send(sock,send_data,strlen(send_data), 0);
close(sock);
break;
}
}
return 0;
}
在这个程序中,如果我对客户端和服务器都使用localhost,我可以绑定到pot并成功连接到服务器。如果我向服务器提供不同的IP,则会出现此问题。请建议对代码进行任何更改以实现我的目标
答案 0 :(得分:2)
您不需要在客户端使用bind()。你在服务器端做bind()。
这张图片可以帮助您理解
http://en.wikipedia.org/wiki/File:InternetSocketBasicDiagram_zhtw.png
的 UPDATE1 强> 的
你可以改用
client_addr.sin_addr.s_addr = INADDR_ANY;
答案 1 :(得分:0)
如果要创建客户端套接字,则不应绑定它。假设您正在创建服务器套接字,那么您应该听。
这里混合了客户端和服务器概念
服务器强>
SOCKET server=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in local;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)400);
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
return 0;
}
if(listen(server,10)!=0)
{
return 0;
}
SOCKET client;
sockaddr_in from;
int fromlen=sizeof(from);
while(true)//we are looping endlessly
{
char temp[512];
client=accept(server,
(struct sockaddr*)&from,&fromlen);
closesocket(client);
}
<强>客户端强>
SOCKET conn;
conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in local;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)400);
if(connect(conn,(struct sockaddr*)&local,sizeof(local)))
{
//Send / Receive
closesocket(conn);
return;
}
答案 2 :(得分:0)
您的问题是您绑定到地址127.0.0.1
。该地址只能 用于连接其他环回地址。
相反,您应该将绑定地址的sin_addr
成员设置为INADDR_ANY
:
client_addr.sin_addr.s_addr = INADDR_ANY;