linux信号量机制实验,Linux系统信号量实验

#include #define MAXLINE 50

typedef struct sockaddr SA;

int main(int argc, char **argv)

{

//定义套接字描述符

int listenfd, connfd, maxfd, i, nbyte;

//定义本机地址结构

struct sockaddr_in myaddr;

char buf[MAXLINE];

//定义套接字集合

fd_set global_rdfs, current_rdfs;

//创建服务端套接字

if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

{

perror("fail to socket");

exit(-1);

}

bzero(&myaddr, sizeof(myaddr));

//地址簇IPV4

myaddr.sin_family = PF_INET;

//本机地址

myaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //htonl(INADDR_ANY);

//端口8888

myaddr.sin_port = htons(8888); /* port number */

//将服务端套接字与本机地址结构进行绑定

if (bind(listenfd, (SA *) &myaddr, sizeof(myaddr)) < 0)

{

perror("fail to bind");

exit(-1);

}

//开始监听

listen(listenfd, 5);

//初始化套接字数据集合

FD_ZERO(&global_rdfs);

//设置套接字集合

FD_SET(listenfd, &global_rdfs);

maxfd = listenfd;

while ( 1 )

{

current_rdfs = global_rdfs;

//对套接字集合进行轮询

if (select(maxfd+1, ¤t_rdfs, NULL, NULL, 0) < 0)

{

perror("fail to select");

exit(-1);

}

else

{

for (i=0; i<=maxfd; i++)

{

//套接字处于准备状态

if (FD_ISSET(i, ¤t_rdfs)) // fd i is ready

{

//若为监听套接字,进行监听客户端连接操作

if (i == listenfd) // new connection is coming

{

connfd = accept(listenfd, NULL, NULL);

//将获取的新套接字描述符加入套接字集合

FD_SET(connfd, &global_rdfs);

maxfd = maxfd > connfd ? maxfd : connfd;

}

//若不为监听套接字(为客户端数据收发套接字),进行数据收发操作

else // client send message

{

//接收失败关闭该套接字描述符,并从套接字集合中清除

if ((nbyte = recv(i, buf, sizeof(buf), 0)) <= 0)

{

close(i);

//从集合中清除套接字

FD_CLR(i, &global_rdfs);

}

//接收成功

else

{

//将从客户端接收到的消息回发至对应客户端

printf("%s\n",buf);

send(i, buf, sizeof(buf), 0);

}

}

}

} // end for

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值