#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #include <string.h> #include <strings.h> #include <ctype.h> #include <sys/wait.h> #include "wrap.h" #define SERV_PORT 8888 void wait_child(int signo) { while(waitpid(0,NULL,WNOHANG)>0); return ; } int main(void) { pid_t pid; int lfd,cfd; struct sockaddr_in serv_addr,clie_addr; socklen_t clie_addr_len; char buf[BUFSIZ]; char clie_IP[BUFSIZ]; int n,i; lfd = Socket(AF_INET,SOCK_STREAM,0); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取设备IP地址 Bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//绑定server 地址结构体,即IP与端口 Listen(lfd,128); while(1){ clie_addr_len = sizeof(clie_addr); cfd = accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len); //打印连接的客户端IP地址,以及端口号 //因为从网络传过来的信息的字节序与本地字节序不相同,所以进行转化 printf("client IP:%s, port:%d\n", inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie_addr.sin_port)); pid = fork(); if(pid == -1){ perror("fork error"); exit(1); }else if(pid == 0){ close(lfd); break; }else { close(cfd); signal(SIGCHLD,wait_child); } } if(pid == 0){ while(1){ n = Read(cfd,buf,sizeof(buf)); if(n == 0){ close(cfd); return 0; }else if(n == -1){ perror("read error"); exit(1); }else{ for(i = 0;i < n;i++) buf[i] = toupper(buf[i]); write(cfd,buf,n); write(STDOUT_FILENO,buf,n); } } } return 0; } /* 测试的话使用nc 命令 举例 nc 127.0.0.1 8888 这是一个将小写转化为大写的server 输入小写字母将反馈大写字幕 */