我正在一个客户端和服务器之间通过建立套接字连接来实现这个简单的聊天应用程序。我能够在同一台计算机上的两个不同终端上运行客户端和服务器。 现在,如何在两台不同的计算机上运行客户端和服务器? 我尝试这样做我给服务器机器的 IP 地址代替服务器程序中的本地主机“127.0.0.1”。它没有用。
谁能告诉我如何实现这个。另外,如何动态传递 ip 地址和端口号?
TCP 客户端
#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<stdlib.h>
int main()
{
char buf[100];
int k;
int sock_desc;
struct sockaddr_in client;
memset(&client,0,sizeof(client));
sock_desc=socket(AF_INET,SOCK_STREAM,0);
if(sock_desc==-1)
{
printf("Error in socket creation");
exit(1);
}
client.sin_family=AF_INET;
client.sin_addr.s_addr=INADDR_ANY;
client.sin_port=3002;
k=connect(sock_desc,(struct sockaddr*)&client,sizeof(client));
if(k==-1)
{
printf("Error in connecting to server");
exit(1);
}
while(1)
{
printf("\nEnter data to be send to server: ");
fgets(buf,100,stdin);
if(strncmp(buf,"end",3)==0)
break;
k=send(sock_desc,buf,100,0);
if(k==-1)
{
printf("Error in sending");
exit(1);
}
k=recv(sock_desc,buf,100,0);
if(k==-1)
{
printf("Error in receiving");
exit(1);
}
printf("Message got from server is : %s",buf);
}
close(sock_desc);
exit(0);
return 0;
}
TCP 服务器
#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<stdlib.h>
int main()
{
char buf[100];
int k;
socklen_t len;
int sock_desc,temp_sock_desc;
struct sockaddr_in server,client;
memset(&server,0,sizeof(server));
memset(&client,0,sizeof(client));
sock_desc=socket(AF_INET,SOCK_STREAM,0);
if(sock_desc==-1)
{
printf("Error in socket creation");
exit(1);
}
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_port=3002;
k=bind(sock_desc,(struct sockaddr*)&server,sizeof(server));
if(k==-1)
{
printf("Error in binding");
exit(1);
}
k=listen(sock_desc,20);
if(k==-1)
{
printf("Error in listening");
exit(1);
}
len=sizeof(client);//VERY IMPORTANT
temp_sock_desc=accept(sock_desc,(struct sockaddr*)&client,&len);
if(temp_sock_desc==-1)
{
printf("Error in temporary socket creation");
exit(1);
}
while(1)
{
k=recv(temp_sock_desc,buf,100,0);
if(k==-1)
{
printf("Error in receiving");
exit(1);
}
printf("Message got from client is : %s",buf);
printf("\nEnter data to be send to client: ");
fgets(buf,100,stdin);
if(strncmp(buf,"end",3)==0)
break;
k=send(temp_sock_desc,buf,100,0);
if(k==-1)
{
printf("Error in sending");
exit(1);
}
}
close(temp_sock_desc);
exit(0);
return 0;
}
最佳答案
您的客户端 sockaddr_in 和服务器 sockaddr_in 是相反的。 客户端 sockaddr_in 结构应该是:
client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr("add server ip here");
client.sin_port=3002;
服务器sockaddr_in结构应该是:
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=3002;
现在您的服务器仅在环回上绑定(bind),您的客户端连接到 INADDR_ANY。
关于c 中的客户端服务器聊天应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297504/