socket服务器代码
来源:互联网 发布:centos 中英输入法转换 编辑:程序博客网 时间:2024/06/06 10:40
创建一个socket使用socket() 系统调用.
使用bind()系统调用套接字绑定到一个地址。对于互联网上的服务器套接字,地址包括主机的端口号。
使用listen()系统调用连接监听。
accept() 系统调用形式接受连接。此调用通常会阻塞,直到有客户端与服务器连接。
发送和接收数据,使用read() 和 write() 系统调用。
现在要把上面这些步骤的形式写成源代码。把这个代码写server.c文件并用gcc编译器编译。
#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>int main( int argc, char *argv[] ){ int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; /* First call to socket() function */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } /* Initialize socket structure */ bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 5001; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); /* Now bind the host address using bind() call.*/ if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("ERROR on binding"); exit(1); } /* Now start listening for the clients, here process will * go in sleep mode and will wait for the incoming connection */ listen(sockfd,5); clilen = sizeof(cli_addr); /* Accept actual connection from the client */ newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); if (newsockfd < 0) { perror("ERROR on accept"); exit(1); } /* If connection is established then start communicating */ bzero(buffer,256); n = read( newsockfd,buffer,255 ); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("Here is the message: %s\n",buffer); /* Write a response to the client */ n = write(newsockfd,"I got your message",18); if (n < 0) { perror("ERROR writing to socket"); exit(1); } return 0; }
处理多个连接:
为了使服务器能够同时处理多个连接,我们在上面的代码进行以下更改:
将accept语句和下面的代码在一个无限循环。
建立连接后,调用fork()创建一个新的进程。
子进程将关闭sockfd中致电doprocessing函数,通过新的套接字文件描述符作为参数。当两个进程已经完成了他们对话中表示由doprocessing()返回,这个过程简单地退出。
父进程关闭newsockfd。因为所有这些代码是在一个无限循环,它接受语句将返回到等待下一个连接。
#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>int main( int argc, char *argv[] ){ int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; /* First call to socket() function */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } /* Initialize socket structure */ bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 5001; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); /* Now bind the host address using bind() call.*/ if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("ERROR on binding"); exit(1); } /* Now start listening for the clients, here * process will go in sleep mode and will wait * for the incoming connection */ listen(sockfd,5); clilen = sizeof(cli_addr); while (1) { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) { perror("ERROR on accept"); exit(1); } /* Create child process */ pid = fork(); if (pid < 0) { perror("ERROR on fork"); exit(1); } if (pid == 0) { /* This is the client process */ close(sockfd); doprocessing(newsockfd); exit(0); } else { close(newsockfd); } } /* end of while */}
Here is the simple implementation of doprocessing function.
void doprocessing (int sock){ int n; char buffer[256]; bzero(buffer,256); n = read(sock,buffer,255); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("Here is the message: %s\n",buffer); n = write(sock,"I got your message",18); if (n < 0) { perror("ERROR writing to socket"); exit(1); }}
0 0
- socket服务器代码
- unity socket 服务器sever 代码
- Socket理解-代码保存(服务器代码)
- Linux开发服务器的常用socket代码
- 采用IOCP技术的socket服务器代码,
- socket 简单实例1.服务器代码
- C++ Socket服务器简单代码示例
- C# 异步Socket (BeginXXXX)服务器代码
- linux socket编程2-服务器代码示例
- php简单socket服务器客户端代码实例
- java socket 服务器代码 自动接收文件并存储服务器
- 最简单的Windows Socket代码,包括服务器和客户端
- 简单的TCP 流式socket 服务器和客户端代码示例
- csapp书上socket的服务器和客户端的代码
- linux-socket tcp客户端服务器编程模型及代码详解
- PHP Workerman框架。用来做php socket服务器的代码
- 基于node服务器的socket在线聊天室代码解析!
- window Socket 进行一次通信的服务器代码
- Androidn Notification的使用,解决找不到setLatestEventInfo方法
- FormData实现异步传送带文件的表单
- 121. Best Time to Buy and Sell Stock
- 【日常小记】linux中强大且常用命令:find、grep
- int和Integer有什么区别?
- socket服务器代码
- 数据库学习笔记
- Android中的Audio播放:音量和远程播放控制
- 泛型总结
- 119. Pascal's Triangle II
- 数组指针和指针数组
- socket客户端
- Linux SVN 搭建 centos
- printf编译时一直出错的原因