linux网络编程多进程并发服务器
2013-04-12 13:59
363 查看
服务器端:
客户端代码:
程序实现的功能很简单,代码写的也比较通俗易懂,基本上没什么注释!代码在我自己的虚拟机里面调试通过,编译即可运行!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #define PORT 1234 #define MAXSIZE 1024 static int clientProcess(int connfd, struct sockaddr_in clientSock) { int num = 0; int i = 0; char recvBuf[MAXSIZE]; char sendBuf[MAXSIZE]; char clientName[MAXSIZE]; num = recv(connfd, clientName, MAXSIZE, 0); if (num < 0) { printf("recv clientName message from client!\n"); return -1; } clientName[strlen(clientName)-1] = '\0'; printf("You got's a connection from %s, client name is %s\n", inet_ntoa(clientSock.sin_addr), clientName); while (1) { num = recv(connfd, recvBuf, MAXSIZE, 0); if (num == 0) { close(connfd); return -1; } recvBuf[strlen(recvBuf)-1] = '\0'; printf("received client (%s) message :%s\n", clientName, recvBuf); //将接收到的信息加密返回给客户端 for (i=0; i<num-1; i++) { if ((recvBuf[i]>='a' && recvBuf[i]<='z') || (recvBuf[i]>='A' && recvBuf[i]<='Z')) { recvBuf[i] = recvBuf[i] + 3; if ((recvBuf[i]>'Z' && recvBuf[i]<'Z'+3) || (recvBuf[i]>'z')) { recvBuf[i] = recvBuf[i] -26; } } sendBuf[i] = recvBuf[i]; } sendBuf[num-1] = '\0'; send(connfd, sendBuf, MAXSIZE, 0); } close(connfd); return 1; } int main(int argc, char **argv) { int listenfd; int connectfd; struct sockaddr_in serverSock; struct sockaddr_in clientSock; socklen_t len = 0; pid_t pid; listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd < 0) { printf("Create socket fails!\n"); return -1; } int opt = SO_REUSEADDR; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt); bzero(&serverSock, sizeof serverSock); serverSock.sin_family = AF_INET; serverSock.sin_port = htons(PORT); serverSock.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(listenfd, (struct sockaddr *)&serverSock, sizeof serverSock) < 0) { printf("bind fails!\n"); return -1; } if (listen(listenfd, 5) < 0) { printf("listen fails!\n"); return -1; } len = (socklen_t)(sizeof clientSock); while (1) { connectfd = accept(listenfd, (struct sockaddr *)&clientSock, &len); if (connectfd < 0) { printf("accept fails!\n"); return -1; } //创建子进程处理客户端的信息 if ((pid = fork()) > 0) { close(connectfd); continue; } else if (pid == 0) { close(listenfd); clientProcess(connectfd, clientSock); return 1; } else { printf("fork() fails!\n"); return -1; } } close(listenfd); }
客户端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORT 1234 #define MAXSIZE 1024 static int clientProcess(FILE *fp, int connfd) { char readLine[MAXSIZE]; char recvLine[MAXSIZE]; int num; printf("connect to server success!\n"); printf("Input client's name:"); if (fgets(readLine, MAXSIZE, fp) == NULL) { printf("fgets fails!\n"); return -1; } send(connfd, readLine, MAXSIZE, 0); while (fgets(readLine, MAXSIZE, fp) != NULL) { if (strncmp(readLine, "quit", strlen("quit")) == 0) { exit(-1); } send(connfd, readLine, strlen(readLine), 0); num = recv(connfd, recvLine, MAXSIZE, 0); if (num < 0) { printf("received fails!\n"); return -1; } recvLine[num-1] = '\0'; printf("Server message:%s\n", recvLine); } return 1; } int main(int argc, char **argv) { int sockfd; struct sockaddr_in serverSock; struct hostent *he; if (argc != 2) { printf("Usage: %s <IP Address>\n", argv[0]); return -1; } he = gethostbyname(argv[1]); if (he == NULL) { printf("gethostbyname fails!\n"); return -1; } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("Create socket fails!\n"); return -1; } bzero(&serverSock, sizeof serverSock); serverSock.sin_family = AF_INET; serverSock.sin_port = htons(PORT); serverSock.sin_addr = *((struct in_addr *)he->h_addr); if (connect(sockfd, (struct sockaddr *)&serverSock, sizeof serverSock) < 0) { printf("connect fails!\n"); return -1; } clientProcess(stdin, sockfd); close(sockfd); return 1; }
程序实现的功能很简单,代码写的也比较通俗易懂,基本上没什么注释!代码在我自己的虚拟机里面调试通过,编译即可运行!
相关文章推荐
- 使用socket的Linux上的C语言helloworld多进程并发服务器
- 并发服务器的实现(进程与线程)
- 单进程单线程,完成并发服务器(基础版)
- TCP并发服务器多进程编程
- linux网络编程----->高并发--->select多路I/O复用服务器
- UNIX网络编程----多进程并发服务器(这样就支持多个客户端连接了)
- Linux网络编程:TCP服务器(单进程多用户),使用select方法实现
- Linux网络编程——tcp并发服务器(poll实现)
- TCP并发服务器,每个客户一个子进程
- 用TCP/TP进行网际互连(6) ———— 利用I/O复用完成单进程并发服务器的处理
- Linux网络编程--单进程服务器处理多客户请求(I/O复用)
- 多进程并发服务器实例
- Linux网络编程——tcp并发服务器(多线程)
- Linux网络编程——tcp并发服务器(poll实现)
- linux socket多进程并发服务器
- socket 并发服务器 代码案例 (多进程模式)
- 用户并发浏览服务器生成进程数
- TCP并发服务器之进程
- 网络编程之并发服务器(线程,进程)
- Linux网络编程之简单并发服务器