• 大小: 9KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-14
  • 语言: 其他
  • 标签: 网络编程  

资源简介

Linux 网络编程——并发服务器的三种实现模型,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45671215

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 

/************************************************************************
函数名称: void main(int argc char *argv[])
函数功能: 主函数,用进程建立一个TCP Echo Server
函数参数: 无
函数返回: 无
************************************************************************/
int main(int argc char *argv[])
{
unsigned short port = 8080; // 本地端口

// 创建tcp套接字
int sockfd = socket(AF_INET SOCK_STREAM 0);   
if(sockfd < 0)
{
perror(“socket“);
exit(-1);
}

// 配置本地网络信息
struct sockaddr_in my_addr;
bzero(&my_addr sizeof(my_addr));   // 清空   
my_addr.sin_family = AF_INET;   // IPv4
my_addr.sin_port   = htons(port);   // 端口
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip

// 绑定
int err_log = bind(sockfd (struct sockaddr*)&my_addr sizeof(my_addr));
if( err_log != 0)
{
perror(“binding“);
close(sockfd);
exit(-1);
}

// 监听,套接字变被动
err_log = listen(sockfd 10); 
if(err_log != 0)
{
perror(“listen“);
close(sockfd);
exit(-1);
}

while(1) //主进程 循环等待客户端的连接
{

char cli_ip[INET_ADDRSTRLEN] = {0};
struct sockaddr_in client_addr;
socklen_t cliaddr_len = sizeof(client_addr);

// 取出客户端已完成的连接
int connfd = accept(sockfd (struct sockaddr*)&client_addr &cliaddr_len);
if(connfd < 0)
{
perror(“accept“);
close(sockfd);
exit(-1);
}

pid_t pid = fork();
if(pid < 0){
perror(“fork“);
_exit(-1);
}else if(0 == pid){ //子进程 接收客户端的信息,并发还给客户端
/*关闭不需要的套接字可节省系统资源,
  同时可避免父子进程共享这些套接字
  可能带来的不可预计的后果
*/
close(sockfd);   // 关闭监听套接字,这个套接字是从父进程继承过来

char recv_buf[1024] = {0};
int recv_len = 0;

// 打印客户端的 ip 和端口
memset(cli_ip 0 sizeof(cli_ip)); // 清空
inet_ntop(AF_INET &client_addr.sin_addr cli_ip INET_ADDRSTRLEN);
printf(“----------------------------------------------\n“);
printf(“client ip=%sport=%d\n“ cli_ipntohs(client_addr.sin_port));

// 接收数据
while( (recv_len = recv(connfd recv_buf sizeof(recv_buf) 0)) > 0 )
{
printf(“recv_buf: %s\n“ recv_buf); // 打印数据
send(connfd recv_buf recv_len 0); // 给客户端回数据
}

printf(“client closed!\n“);

close(connfd);    //关闭已连接套接字

exit(0);
}else if(pid > 0){ // 父进程

close(connfd);    //关闭已连接套接字

}
}

close(sockfd);

    return 0;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2710  2015-05-13 14:56  并发服务器测试代码\tcp_echo_fork.c
     文件        3213  2015-05-13 15:44  并发服务器测试代码\tcp_echo_pthread.c
     文件        3485  2015-05-13 17:10  并发服务器测试代码\tcp_echo_pthread_pro.c
     文件        4311  2015-05-15 14:39  并发服务器测试代码\tcp_echo_select.c
     文件        1976  2015-05-13 12:13  并发服务器测试代码\tcp_while_recv.c
     文件        1739  2015-05-13 12:00  并发服务器测试代码\udp_while_recv.c
     目录           0  2015-05-15 14:47  并发服务器测试代码\

评论

共有 条评论