当前位置: 技术问答>linux和unix
请教高手一个Linux Socket编程的问题
来源: 互联网 发布时间:2016-02-12
本文导语: 我们在Linux编一个简单的socket服务器端和客户端程序通讯程序,发现只能在本机上使用,当不在同一台机上使用时。连接不上,代码如下,请高手指点问题所在: 服务器端程序 #include #include #include #include #include #include...
我们在Linux编一个简单的socket服务器端和客户端程序通讯程序,发现只能在本机上使用,当不在同一台机上使用时。连接不上,代码如下,请高手指点问题所在:
服务器端程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490
#define BACKLOG 10
#define MAXDATASIZE 1024
int sockfd,new_fd;
pthread_t accthread,recthread;
void recmessage(void)
{
while(1)
{
int numbytes;
char buf[MAXDATASIZE];
if((numbytes=recv(new_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
buf[numbytes]='';
if(strcmp(buf,"exit")==0)
{
printf("Client is closed.n");
close(new_fd);
close(sockfd);
exit(1);
}
printf("Client: %sn",buf);
}
}
void acceptconnect(void)
{
struct sockaddr_in their_addr;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("server: got connection from %s.n",inet_ntoa(their_addr.sin_addr));
if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!=0)
{
printf("Create thread error.n") ;
exit(1);
}
}
int main()
{
struct sockaddr_in my_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket") ;
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
if((pthread_create(&accthread,NULL,(void *)acceptconnect,NULL))!=0)
{
printf("Create thread error!n");
exit(1);
}
while(1)
{
char msg[MAXDATASIZE];
scanf("%s",msg);
if(send(new_fd,msg,strlen(msg),0)==-1)
{
perror("send");
close(new_fd);
exit(1);
}
if(strcmp(msg,"exit")==0)
{
printf("Byebye!n");
close(new_fd);
close(sockfd);
exit(1);
}
}
return 0;
}
服务器端程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490
#define BACKLOG 10
#define MAXDATASIZE 1024
int sockfd,new_fd;
pthread_t accthread,recthread;
void recmessage(void)
{
while(1)
{
int numbytes;
char buf[MAXDATASIZE];
if((numbytes=recv(new_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
buf[numbytes]='';
if(strcmp(buf,"exit")==0)
{
printf("Client is closed.n");
close(new_fd);
close(sockfd);
exit(1);
}
printf("Client: %sn",buf);
}
}
void acceptconnect(void)
{
struct sockaddr_in their_addr;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("server: got connection from %s.n",inet_ntoa(their_addr.sin_addr));
if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!=0)
{
printf("Create thread error.n") ;
exit(1);
}
}
int main()
{
struct sockaddr_in my_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket") ;
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
if((pthread_create(&accthread,NULL,(void *)acceptconnect,NULL))!=0)
{
printf("Create thread error!n");
exit(1);
}
while(1)
{
char msg[MAXDATASIZE];
scanf("%s",msg);
if(send(new_fd,msg,strlen(msg),0)==-1)
{
perror("send");
close(new_fd);
exit(1);
}
if(strcmp(msg,"exit")==0)
{
printf("Byebye!n");
close(new_fd);
close(sockfd);
exit(1);
}
}
return 0;
}
|
你在客户端用
telnet '你的服务器IP' 3490
telnet '你的服务器主机名' 3490
试一下
如果两个都不通,那就是防火墙或网络的问题了;
如果IP通,主机名不通,是DNS的问题,最简单就是在/etc/hosts文件里增加一条服务器地址和名称的记录;或者直接用IP
telnet '你的服务器IP' 3490
telnet '你的服务器主机名' 3490
试一下
如果两个都不通,那就是防火墙或网络的问题了;
如果IP通,主机名不通,是DNS的问题,最简单就是在/etc/hosts文件里增加一条服务器地址和名称的记录;或者直接用IP
|
没看到你填IP的地方...
没有IP,不同机子如何通讯...
没有IP,不同机子如何通讯...
|
为什么不用select, poll, epoll结构呢?全局的new_fd仅能保存一个接收的fd, 如果再来一个客户端怎么办?
|
IP有的, 他用的命令行.
|
有没有可能是你的防火墙的设置问题呢?程序是在哪里就中断了?
|
当不在同一台机上使用时。连接不上
gethostbyname用的是dns里的解释内容,即然是不同的主机连不上,有没有可能是你的dns里没有相应的服务器的地址,就是客户机不知道服务器的信息
gethostbyname用的是dns里的解释内容,即然是不同的主机连不上,有没有可能是你的dns里没有相应的服务器的地址,就是客户机不知道服务器的信息
|
gethostname好象不能这样用,你直接用ip地址来填充就可以了.
-
-
|
个人感觉是你的网络问题.
|
gethostname错误,请直接用IP,否则设置机器的DNS