mysocket.h
#ifndef MYSOCKET_H #define MYSOCKET_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/types.h> #include <errno.h> #include <sys/socket.h> #include <sys/select.h> #include <sys/time.h> #include <netinet/in.h> #include <sys/wait.h> #define PORT 8080 //监听端口 #define MAXN 200 //最大连接数 #define MAXM 1024 //接受缓冲区大小 typedef struct sockaddr_in SA; char buf[MAXM]; int sockfd; SA serveraddr, cliaddr; //向connfd发送数据Msg void SendMsg(int connfd, char *Msg); //传入指向套接口指针,指向服务器指针 //返回监听套接口sockfd void Socket(int *Psockfd , SA *Pserveraddr); void ServerRun(); #endif
initsock.c
#include "mysocket.h" //传入指向套接口指针,指向服务器指针 //返回监听套接口sockfd void Socket(int *Psockfd, SA *Pserveraddr) { *Psockfd = socket(AF_INET, SOCK_STREAM, 0); if((*Psockfd) == -1) { printf("socket error initsock.c/n"); exit(1); } printf("socket success.../n"); bzero(Pserveraddr, sizeof(SA)); Pserveraddr->sin_family = AF_INET; Pserveraddr->sin_addr.s_addr = htonl(INADDR_ANY); Pserveraddr->sin_port = htons(PORT); if(bind(*Psockfd, (struct sockaddr*)Pserveraddr, sizeof(SA)) == -1) { printf("bind error in initsock.c/n"); exit(1); } printf("bind success.../n"); if(listen(*Psockfd, MAXN) == -1) { printf("listen error initsock.c/n"); exit(1); } printf("listhen success.../n"); return ; }
send.c
#include "mysocket.h" void SendMsg(int connfd, char *Msg) { int len = strlen(Msg); int n; while( (n = send(connfd, Msg, strlen(Msg), 0)) > 0) { len -= n; } }
run.c
#include "mysocket.h" void ServerRun() { Socket(&sockfd, &serveraddr); printf("Server Running.../n"); while(1) { socklen_t len = sizeof(cliaddr); int connfd = accept(sockfd, (struct sockaddr*)&cliaddr, &len); if(connfd == -1) { printf("accept error in Run.c/n"); continue; } if(fork() == 0) { close(sockfd); SendMsg(connfd, "This is a simple server./nBy Ruibin Chen/nFrom GDUT CS/n"); printf("send success/n"); exit(0); } close(connfd); //等待所有子进程退出 //int stat; //while(waitpid(-1, &stat, WNOHANG) > 0); waitpid(-1,NULL,WNOHANG); } close(sockfd); return; }
server.c
#include "mysocket.h" int main() { ServerRun(); return 0; }
在linux下用以下命令可以编译:
gcc -Wall initsock.c run.c send.c server.c -o server