当前位置: 技术问答>linux和unix
请问关于socket的问题
来源: 互联网 发布时间:2016-11-14
本文导语: 在linux下,编写服务端程序8-s.c 和 客户端程序8-c.c 问题较多请各位多多包涵,在此先谢了 /*----------服务端程序8-s.c---*/头文件省去 #define SERVPORT 3333 #define BACKLOG 10 int main() { int sockfd,client_fd; /sock_fd:监...
在linux下,编写服务端程序8-s.c 和 客户端程序8-c.c 问题较多请各位多多包涵,在此先谢了
/*----------服务端程序8-s.c---*/头文件省去
#define SERVPORT 3333
#define BACKLOG 10
对于服务端的程序问题是:
(1)my_addr.sin_addr.s_addr=INADDR_ANY;是这样赋值的呢?s_addr INADDR_ANY分别代表什么意思呢?(因为struct socksddr_in{struct in_addr sin_addr;}并没有s_addr项,又或者说,我可以通过什么方式查询s_addr带表什么意思呢)
(2)为什么要现在子进程关闭socket即close(client_fd),接着又在父进程关闭sock即close(client_fd),也就是说为什么要关闭两次呢?
(3)为什么刚开始创建的socket即:sockfd不用关闭呢?
-----------------------------------------------------------------------------
/*-----客户端8-c.c--*/
客户端的问题是:
(1)fprintf(stderr,"enter hostnamen") 此函数中 stderr是怎么确定的呢(我用man fprintf没有找到适合的答案)
(2) serv_addr.sin_addr=*((struct in_addr *)host->h_addr);为什么可以这么用呢?(和服务端程序的赋值有所不同)。
(3)定义了struct hostent *host,如果我想知道这个结构体的具体细节应该怎么查询呢(比如像函数那样 man 函数名)
(4)bzero(&(serv_addr.sin_zero),8);后面的8是不是凡是用到bzero函数的话就不变的呢?(因为strcut sockaddr_in{insig char sin_zero[8],我觉得是有这个[8]决定的})
/*----------服务端程序8-s.c---*/头文件省去
#define SERVPORT 3333
#define BACKLOG 10
int main()
{
int sockfd,client_fd; /sock_fd:监听socket;client_fd:数据传输socket
struct sockaddr_in my_addr; /本机地址信息/
struct sockaddr_in remote_addr; /客户端信息/
int sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("sock创建失败");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
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 wrong");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen wrong");
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)
{
perror("accept error");
continue;
}
printf("收到来自:%sn",inet_ntoa(remote_addr.sin_addr));
if(!fork()) /创建子进程/
{
if(send(client_fd,"hello, worldn",14,0)==-1)
perror("send wrong");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
对于服务端的程序问题是:
(1)my_addr.sin_addr.s_addr=INADDR_ANY;是这样赋值的呢?s_addr INADDR_ANY分别代表什么意思呢?(因为struct socksddr_in{struct in_addr sin_addr;}并没有s_addr项,又或者说,我可以通过什么方式查询s_addr带表什么意思呢)
(2)为什么要现在子进程关闭socket即close(client_fd),接着又在父进程关闭sock即close(client_fd),也就是说为什么要关闭两次呢?
(3)为什么刚开始创建的socket即:sockfd不用关闭呢?
-----------------------------------------------------------------------------
/*-----客户端8-c.c--*/
#define SERVPORT 3333
#define MAXDATASIZE 100 /每次最多数据传输量/
int main(int argc,char *argv[])
{
int sockfd,recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if(argch_addr);
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("connect error");
exit(1);
}
if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("connect wrong");
exit(1);
}
buf[recvbytes]='';
printf("收到:%s",buf);
close(sockfd);
}
客户端的问题是:
(1)fprintf(stderr,"enter hostnamen") 此函数中 stderr是怎么确定的呢(我用man fprintf没有找到适合的答案)
(2) serv_addr.sin_addr=*((struct in_addr *)host->h_addr);为什么可以这么用呢?(和服务端程序的赋值有所不同)。
(3)定义了struct hostent *host,如果我想知道这个结构体的具体细节应该怎么查询呢(比如像函数那样 man 函数名)
(4)bzero(&(serv_addr.sin_zero),8);后面的8是不是凡是用到bzero函数的话就不变的呢?(因为strcut sockaddr_in{insig char sin_zero[8],我觉得是有这个[8]决定的})
|
对,父进程中没有使用client_fd,直接关闭了
|
查找 struct in_addr 的定义即可:
/* Internet address. */
struct in_addr {
__be32 s_addr; // be = big endian 字节序
};
INADDR_ANY 表示“Address to accept any incoming messages.”,也就是 任意地址
|
stderr就是标准错误句柄,通常是屏幕输出
绑定INADDR_ANY表示监听任意IP地址的包,包括环回接口127.0.0.1
bzero就是用0填充memset,后面的大小是跟你需要清零的内存大小有关的
从楼主的问题可以看出,楼主需要在所有的方面加强,这么多的问题,一下子问出来是没有效果的,因为你自己都没有备选答案,更加谈不上从回答中获取正确信息了
绑定INADDR_ANY表示监听任意IP地址的包,包括环回接口127.0.0.1
bzero就是用0填充memset,后面的大小是跟你需要清零的内存大小有关的
从楼主的问题可以看出,楼主需要在所有的方面加强,这么多的问题,一下子问出来是没有效果的,因为你自己都没有备选答案,更加谈不上从回答中获取正确信息了
|
服务端的程序问题:
1、INADDR_ANY 表示任意可用地址,也就是说客户端可以通过服务器的任何一个地址来访问
2、父子进程地址空间独立,其中的client_fd是两个完全不相关的变量
3、sockfd不能关闭,因为还要继续监听新的请求
客户端的问题是:
1、stderr 是标准错误输出
2、3 man gethostbyname
4、bzero 就是用来清零内存的,长度参数根据实际场景而定
“我觉得是有这个[8]决定的”,嗯对√
1、INADDR_ANY 表示任意可用地址,也就是说客户端可以通过服务器的任何一个地址来访问
2、父子进程地址空间独立,其中的client_fd是两个完全不相关的变量
3、sockfd不能关闭,因为还要继续监听新的请求
客户端的问题是:
1、stderr 是标准错误输出
2、3 man gethostbyname
4、bzero 就是用来清零内存的,长度参数根据实际场景而定
“我觉得是有这个[8]决定的”,嗯对√