当前位置:  技术问答>linux和unix

做了一个简单的server,里面使用fork()创建子进程,但是导致不能通信,大家谁知道是怎么回事。

    来源: 互联网  发布时间:2015-10-27

    本文导语:  就是最简单的sock服务器,监听,然后连接,发送一些信息。 如果不创建子进程,直接往连接端发送就没问题,客户端就能收到,如果使用了fork创建了 子进程,则客户端就收不到。 难道说不能使用这种方式么?但是...

就是最简单的sock服务器,监听,然后连接,发送一些信息。
如果不创建子进程,直接往连接端发送就没问题,客户端就能收到,如果使用了fork创建了
子进程,则客户端就收不到。

难道说不能使用这种方式么?但是我是从网上找的代码,难道也是不对的?

|
server端要不断的循环fork(),然后把accept放在child process中。估计就是那个原因,我这儿有个原代玛,希望对你有用。
SERVER:
 
 
  #include 

#include 

#include 

#include 

#include 

#include  

#include 

#include 

#define MYPORT 3490                 /* 监听的端口 */ 

#define BACKLOG 10                 /* listen的请求接收队列长度 */

 

void main() {

int sockfd, new_fd;             /* 监听端口,数据端口 */

struct sockaddr_in sa;         /* 自身的地址信息 */ 

struct sockaddr_in their_addr; /* 连接对方的地址信息 */ 

int sin_size;

 

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket"); 

exit(1); 

}

sa.sin_family = AF_INET;

sa.sin_port = htons(MYPORT);         /* 网络字节顺序 */

sa.sin_addr.s_addr = INADDR_ANY;     /* 自动填本机IP */

bzero(&(sa.sin_zero), 8);             /* 其余部分置0 */

if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {

perror("bind");

exit(1);

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen");

exit(1);

}

 

/* 主循环 */

while(1) {

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))

if (new_fd == -1) {

perror("accept");

continue;

}

printf(”Got connection from %sn", inet_ntoa(their_addr.sin_addr));

if (fork() == 0) {

/* 子进程 */

if (send(new_fd, "Hello, world! n", 14, 0) == -1)

perror("send");

close(new_fd);

exit(0);

}

close(new_fd);

/*清除所有子进程 */

while(waitpid(-1,NULL,WNOHANG) > 0); 

}

}
 
CLIENT:
 
 
  #include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define PORT 3490 /* Server的端口 */

#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 hostnamen");

exit(1);

}

 

/* get the host info */

if ((he=gethostbyname(argv[1])) == NULL) {

/* 注意:获取DNS信息时,显示出错需要用herror而不是perror */

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT); /* short, NBO */

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8); /* 其余部分设成0 */

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("Received: %s",buf);

close(sockfd);

return 0;

}
 

|
贴出代码来

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • 请教高人:同一个套接字(做客户端)连接到server后在不同子进程里使用能否不采取互斥措施收发?
  • SQL Server内存遭遇操作系统进程压榨案例分析
  • java命名空间javax.management.monitor类monitor的类成员方法: server定义及介绍
  • 纯异步的Server简单实现 Server
  • java命名空间java.net类httpurlconnection的类成员方法: http_server_error定义及介绍
  • 关于iPlanet Web Server在Win2000Server上配置运行的问题?(在线等待,解决寄给分,请进!)
  • java命名空间javax.security.sasl类sasl的类成员方法: server_auth定义及介绍
  • 如果实现类似server start 和server stop这样的功能.
  • java命名空间java.rmi.server类uid的类成员方法: uid定义及介绍
  • 命令用法 smbmount //server/share /mnt/server -o username=administrator
  • java命名空间java.rmi.server类logstream的类成员方法: brief定义及介绍
  • iPlanet Directory Server和iPlanet Web Server性能、价格各几何?
  • java命名空间java.rmi.server接口remoteref的类成员方法: serialversionuid定义及介绍
  • 微软网站下载的Ms SQL Server2000 JDBC Driver,必须用英文版的SQL server2000吗?
  • java命名空间java.net枚举authenticator.requestortype的类成员方法: server定义及介绍
  • 我是server生手,请问关于domain和server的问题
  • java命名空间java.rmi.server类logstream的类成员方法: silent定义及介绍
  • 关于iPlanet Web Server在Win2000Server上配置运行的问题?(在线等待,解决即给分,请进!)
  • java命名空间java.rmi.server类remoteobject的类成员方法: ref定义及介绍
  • 把一个web app从一个tomcat server移到另一个tomcat server,中文乱吗!!!
  • java命名空间java.rmi.server类servernotactiveexception的类成员方法: servernotactiveexception定义及介绍
  • 安装sql server 2008 management提示已安装 SQL Server 2005 Express的解决方法
  • java命名空间java.rmi.server接口unreferenced的类成员方法: unreferenced定义及介绍
  • Application Server、Web Server、中间件、EJB容器的概念与区别!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3