客户端无法绑定到给定端口并连接到给定服务器

我需要我的客户端绑定到特定端口,然后连接到其服务器。 问题是如果我成功绑定到给定端口但无法连接到服务器。 如果我不尝试绑定到端口,我可以连接到服务器。 以下是我的计划:

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,则会出现此问题。 请建议对代码进行任何更改以实现我的目标

您的问题是您绑定到地址127.0.0.1 。 该地址只能用于连接其他环回地址。

相反,您应该将绑定地址的sin_addr成员设置为INADDR_ANY

 client_addr.sin_addr.s_addr = INADDR_ANY; 

您不需要在客户端使用bind()。 你在服务器端做bind()。

这张照片可以帮助您理解

http://en.wikipedia.org/wiki/File:InternetSocketBasicDiagram_zhtw.png

UPDATE1

你可以改用

client_addr.sin_addr.s_addr = INADDR_ANY;

如果要创建客户端套接字,则不应绑定它。 假设您正在创建服务器套接字,那么您应该听。

在这里,您将混合客户端和服务器概念

服务器

 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; }