- /*** 面向套接字通信示例*/
- /**c by angryfox http://blog.angryfox.com*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #define PORT 5678
- #define MAX 10
- int main(){
- int sockfd,newsockfd,is_conneted[MAX],fd;
- struct sockaddr_in addr;
- int addr_len = sizeof(struct sockaddr_in);
- fd_set myreadfds;
- char msgbuffer[256];
- char msg[] = "This is the message from server.Connected.\\n";
- if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ /**建立一个socket*/
- perror("socket");
- exit(1);
- }else{
- printf("socket created .\\n"); /*socket建立成功,输出提示*/
- printf("socket id:%d \\n",sockfd);
- }
- bzero(&addr,sizeof(addr)); /*清空addr所在的内存*/
- addr.sin_family = AF_INET;
- addr.sin_port = htons(PORT);
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- if(bind(sockfd,&addr,sizeof(addr))<0){/*绑定端口*/
- perror("connect");
- exit(1);
- }else{
- printf("connected. \\n");
- printf("local port:%d\\n",PORT);
- }
- if(listen(sockfd,3)<0){/*开始监听*/
- perror("listen");
- exit(1);
- }else{
- printf("listening.....\\n");
- }
- for(fd=0;fd<MAX;fd++){
- is_conneted[fd] = 0;/*设置所有的标记为0*/
- }
- while(1){/*进入一个循环,处理所有的链接*/
- FD_ZERO(&myreadfds);/*清空一个标志*/
- FD_SET(sockfd,&myreadfds);/*设置标志*/
- for(fd=0;fd<MAX;fd++){
- if(is_conneted[fd]){/*判断有没有连接*/
- FD_SET(fd,&myreadfds);/*设置标志*/
- }
- }
- if(!select(MAX,&myreadfds,NULL,NULL,NULL)){/*如果达到最大连接则进入下次循环*/
- continue;
- }
- for(fd=0;fd<MAX;fd++){/*进入一个循环*/
- if(FD_ISSET(fd,&myreadfds)){ /*判断标志*/
- if(sockfd==fd){/*如果新建的socket与fd相同*/
- if((newsockfd = accept (sockfd,&addr,&addr_len))<0){/*接受一个连接,新建一个socket*/
- perror("accept");
- }
- write(newsockfd,msg,sizeof(msg));/*给客户端发送一段信息*/
- is_conneted[newsockfd] = 1;/*设置标志*/
- printf("connect from %s\\n",inet_ntoa(addr.sin_addr)); /*输出客户端ip*/
- }else{
- bzero(msgbuffer,sizeof(msgbuffer));/*清空字符串*/
- if(read(fd,msgbuffer,sizeof(msgbuffer))<0){/*读取结束*/
- printf("connect closed. \\n"); /*输出连接关闭*/
- is_conneted[fd]=0;/*设置标志*/
- close(fd);/*关闭一个socket*/
- }else{
- write(fd,msgbuffer,sizeof(msgbuffer));/*发送接收到的消息*/
- printf("message:%s \\n",msgbuffer);/*输出接收到的信息*/
- }
- }
- }
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/250620134280.html
来源: http://www.codesnippet.cn/detail/250620134280.html