当前位置: 技术问答>linux和unix
谁能帮我调调这个简单的程序?急!!!
来源: 互联网 发布时间:2015-01-30
本文导语: 最近当开始学习在Linux平台下写程序,现在写了一个Socket程序。是C/S模式,实现的功能是客户端一旦与服务器连接成功,服务器就向客户发送一个字符串:"hello world!"。不过始终调不过。我也不知道哪儿出了错,还请哪...
最近当开始学习在Linux平台下写程序,现在写了一个Socket程序。是C/S模式,实现的功能是客户端一旦与服务器连接成功,服务器就向客户发送一个字符串:"hello world!"。不过始终调不过。我也不知道哪儿出了错,还请哪位高手帮我调调。谢谢先!
另外还想问的是:我用命令man想查询关于结构sockaddr_in的资料,键入!man 1(或2或3) sockaddr_in都查不到。那我应该怎样查?
程序如下:
服务器端:
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 4000
#define BACKLOG 10
main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
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);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
{
perror("accept");
continue;
}
if(!fork())//子进程
{
if(send(new_fd,"hello,world!",14,0)==-1)
{
perror("send");
close(new_fd);
exit(0);
}
close(new_fd);
}
}
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#define PORT 5000
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr;
if(argc!=2)
{
fprintf(stderr, "usage:client hostname");
exit(1);
}
if((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);
their_addr.sin_addr=(struct in_addr *)he->h_addr;//(这一行报错)
bzero(&(their_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
buf[numbytes] = ' ';
printf("%s",buf);
return 0;
}
另外还想问的是:我用命令man想查询关于结构sockaddr_in的资料,键入!man 1(或2或3) sockaddr_in都查不到。那我应该怎样查?
程序如下:
服务器端:
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 4000
#define BACKLOG 10
main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
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);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
{
perror("accept");
continue;
}
if(!fork())//子进程
{
if(send(new_fd,"hello,world!",14,0)==-1)
{
perror("send");
close(new_fd);
exit(0);
}
close(new_fd);
}
}
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#define PORT 5000
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr;
if(argc!=2)
{
fprintf(stderr, "usage:client hostname");
exit(1);
}
if((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);
their_addr.sin_addr=(struct in_addr *)he->h_addr;//(这一行报错)
bzero(&(their_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
buf[numbytes] = ' ';
printf("%s",buf);
return 0;
}
|
这种结构用man是看不了的
struct sockaddr_in{
short sin_family;/*socket()系统调用的协议族如AF_INET*/
u_short sin_port;/*网络字节次序形式的端口号码*/
struct in_addr sin_addr;/*网络字节次序形式的网络地址*/
char sin_zero[8];
}
只有上网找
struct sockaddr_in{
short sin_family;/*socket()系统调用的协议族如AF_INET*/
u_short sin_port;/*网络字节次序形式的端口号码*/
struct in_addr sin_addr;/*网络字节次序形式的网络地址*/
char sin_zero[8];
}
只有上网找
|
你在 their_addr.sin_addr=(struct in_addr *)he->h_addr;//(这一行报错)
试试这个看,
bcopy(he->h_addr,&their_addr.sin_addr,he->h_length);
试试这个看,
bcopy(he->h_addr,&their_addr.sin_addr,he->h_length);
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。