linux下IP v6 tcp服务器端源码示例
2010-01-04 19:22
246 查看
/****************************** * * server.c * ******************************/ #include<stdio.h> #include<stdlib.h> #include<sys/socket.h> #include<sys/types.h> #include<errno.h> #include<string.h> #include<netinet/in.h> #include<sys/wait.h> #include<unistd.h> #include<arpa/inet.h> #include<pthread.h> #define MAXBUF 1024 #define LISNUM 10 #define DEFULT_PORT 8787 void *connect_to_client(void *data); struct sockaddr_in6 serv_addr,client_addr; /**************************/ int main(int argc,char *argv[]) { int sockfd,new_fd; unsigned int serv_port; unsigned int lisnum; char buf[MAXBUF+1]; printf( "the command is %s [port] [listen_num]/n", argv[0] ); // 监听起始端口 if ( argv[1] != NULL ) { serv_port = atoi( argv[1] ); } else { serv_port = DEFULT_PORT; } // 监听端口个数 if ( argv[2] != NULL ) { lisnum = atoi(argv[2]); } else { lisnum = LISNUM; } // 创建socket if ( (sockfd = socket(PF_INET6,SOCK_STREAM,0)) < 0 ) { perror("creat socket"); exit(1); } // 配置服务器地址与端口 bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin6_family = AF_INET6; serv_addr.sin6_port = htons(serv_port); serv_addr.sin6_addr = in6addr_any; // 地址绑定操作 if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr) ) <0 ) { perror("bind"); exit(1); } // 服务器监听 if ( listen(sockfd, lisnum) < 0 ) { perror("listen"); exit(1); } while(1) { int len = sizeof(struct sockaddr_in6); if ( (new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &len)) < 0 ) { perror("accept"); exit(errno); } printf("receive the request form %s/n", inet_ntop(AF_INET6, &client_addr, buf, sizeof(buf))); // 接收到1个TCP连接则创建1个线程用于数据通讯 pthread_t child_thread; if ( pthread_create( &child_thread, NULL, connect_to_client, (void *)new_fd) < 0) { perror("create thread"); continue; } } close( sockfd ); return(0); } /************************************ * * 子程序:用于处理一个与客户端的连接,由一个线程来执行 * ************************************/ void *connect_to_client(void *data) { int i; int client_fd=(int)data; char recv_buf[MAXBUF+1]; char send_buf[MAXBUF+1]; char buf[MAXBUF+1]; while(1) { sprintf( send_buf, ">>" ); if ( send(client_fd, send_buf, strlen(send_buf), 0) < 0 ) { perror("send"); continue; } // 从客户端接收数据,直到接收到换行符 while ( i < MAXBUF-1 ) { if ( recv(client_fd, &recv_buf[i], 1, 0) < 0 ) { perror("recv"); break; } if ( recv_buf[i] == '/n' ) { break; } i++; } recv_buf[i] = '/0'; i = 0; // 将接收到的数据输出到标准输出 printf("receive message from '%s':%s/n", inet_ntop(AF_INET6, &client_addr.sin6_addr, buf, sizeof(buf)), recv_buf); } }//end sub_function
相关文章推荐
- linux下IP v6 tcp客户端源码示例
- linux下udp服务器端源码示例
- linux下tcp服务器源码示例
- 我个人的Linux TCP server和client测试源码,C语言(★firecat推荐★)
- Linux tcp被动打开内核源码分析
- [Linux] c 语言tcp socket 示例从简单到复杂
- linux高编之TCP服务器端select函数
- Linux Tcp客户端和服务器端代码实现
- Linux程序设计之套接字: TCP网络服务器源码
- linux内核参数tcp_syn_retries、tcp_retries1和tcp_retries2的源码分析
- linux下TCP编程示例(服务端/客户端)
- linux--------net- tcp----------客户端和服务器端 同步互相收发消息
- linux 使用c在tcp socket服务器端获取客户端ip
- Java API——RMIIO入门教程(3)远程流传输示例之RMIIO服务器端源码
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- linux下tcp编程简单示例
- linux下大文件读写源码示例
- Linux TCP/IP 协议栈源码分析 - 数据 发送/接收 流程图
- 【Linux 内核网络协议栈源码剖析】数据包接收(含TCP协议状态变换)
- 基于TCP的服务器端/客户端(一)---------网络编程(linux----C)