当前位置: 技术问答>linux和unix
关于socket编程,困扰中.(求助,万分感激)
来源: 互联网 发布时间:2015-02-28
本文导语: 我在用socket编程时服务器端使用子进程去处理连接后的通信. 代码如下: int Init_Net_OP() { int sockfd,connfd; struct sockaddr_in serv_addr,client_addr; int sin_size; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stde...
我在用socket编程时服务器端使用子进程去处理连接后的通信.
代码如下:
int Init_Net_OP()
{
int sockfd,connfd;
struct sockaddr_in serv_addr,client_addr;
int sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"socket error!n");
return -1;
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"bind error!n");
return -1;
}
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"listen error!n");
return -1;
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((connfd=accept(sockfd,(struct sockaddr *)&client_addr,&sin_size))==-1)
{
fprintf(stderr,"accept error!n");
continue;
}
printf("server got connection from%sn",inet_ntoa(client_addr.sin_addr));
/*
strcpy(key,"rc6keyabcdefghijllmnopqresuvwxyz");
server_init(connfd,key);
*/
if(!fork())
{
close(sockfd);
strcpy(key,"rc6keyabcdefghijllmnopqresuvwxyz");
if(server_init(connfd,key)==-1)//一些初始化操作
{
close(connfd);
close(connfd);
continue;
}
close(connfd);
exit(0);
}
close(connfd);
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
现在老师要求我在以后的通信中无论服务器或是客户端都可以随时发送或是接收信息.但是我不懂该怎么做,要实现双方通信就必需一方是write而另一方就是read.这样才能收到吧. 要实现随时可收可发该怎么办呢?
可不可以在服务器的子进程中使用select同时监听这一描述符的听和写呢?就是监听到读就绪就执行read,写就绪就可以write.客户端也用这样的方法,可以吗?
有没有谁可以帮我解决这个问题?感激不尽!!!
代码如下:
int Init_Net_OP()
{
int sockfd,connfd;
struct sockaddr_in serv_addr,client_addr;
int sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"socket error!n");
return -1;
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"bind error!n");
return -1;
}
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"listen error!n");
return -1;
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((connfd=accept(sockfd,(struct sockaddr *)&client_addr,&sin_size))==-1)
{
fprintf(stderr,"accept error!n");
continue;
}
printf("server got connection from%sn",inet_ntoa(client_addr.sin_addr));
/*
strcpy(key,"rc6keyabcdefghijllmnopqresuvwxyz");
server_init(connfd,key);
*/
if(!fork())
{
close(sockfd);
strcpy(key,"rc6keyabcdefghijllmnopqresuvwxyz");
if(server_init(connfd,key)==-1)//一些初始化操作
{
close(connfd);
close(connfd);
continue;
}
close(connfd);
exit(0);
}
close(connfd);
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
现在老师要求我在以后的通信中无论服务器或是客户端都可以随时发送或是接收信息.但是我不懂该怎么做,要实现双方通信就必需一方是write而另一方就是read.这样才能收到吧. 要实现随时可收可发该怎么办呢?
可不可以在服务器的子进程中使用select同时监听这一描述符的听和写呢?就是监听到读就绪就执行read,写就绪就可以write.客户端也用这样的方法,可以吗?
有没有谁可以帮我解决这个问题?感激不尽!!!
|
用select的话可以不用多线程了
|
每个socket都有一个接收缓冲区和一个发送缓冲区,对于“服务器或是客户端都可以随时发送或是接收信息”完全是没问题的,在程序内部做同步就可以了。是你的程序太简单了。接入多个socket可以用select方式。
|
呵呵,你的思路非常正确!