#include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> struct _NSS_HEADER { unsigned short ProtocolVersion; /* 协议版本信息 */ unsigned short MsgType; /* 消息类型 */ unsigned short TransactionNo; /* 传输编号 */ unsigned short PacketLength; /* 数据包长度,包括Header */ }NSS_HEADER; void str_echo(int sockfd) { ssize_t readLen; ssize_t writeLen; char buf[8]; while ( true ) { readLen = read(sockfd, buf, 8); if (readLen < 0 && errno == EINTR) { continue; } else if ( readLen <= 0 ) { perror( "read:"); return ; } printf( "recv data successed. data len: %d/n", readLen ); int nWriteLen = 0; while ( true ) { writeLen == write(sockfd, &buf[nWriteLen], readLen-nWriteLen); if (writeLen < 0 && errno == EINTR) { continue; } else if ( writeLen < 0 ) { perror ( "write:" ); return; } nWriteLen += writeLen; // 已写完,直接返回 if (nWriteLen >= readLen ) { break; } } printf( "send data successed. data len: %d/n", readLen ); } } int main(int argc, char **argv) { printf( "server ip: %s/n", argv[1] ); printf( "server port: %s/n", argv[2] ); printf( "/nservice starting ... /n/n" ); int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = socket (AF_INET, SOCK_STREAM, 0); if ( -1 == listenfd ) { perror( "socket:" ); exit(-1); } // 设置地址可复用 int option = 1; setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) ); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr( argv[1]); servaddr.sin_port = htons (atoi(argv[2])); int bindResult = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if ( -1 == bindResult ) { perror( "bind:" ); exit(-1); } int listenResult = listen(listenfd, 5); if ( -1 == listenResult ) { perror( "listen:" ); exit(-1); } for ( ; ; ) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); if ( -1 == connfd ) { perror( "accept:" ); continue; } printf ("accept %s successed.fd: %d/n", inet_ntoa(cliaddr.sin_addr), connfd ); if ( (childpid = fork()) == 0) { /* child process */ close(listenfd); /* close listening socket */ str_echo(connfd); /* process the request */ printf ("disconnect from %d ./n", connfd ); exit (0); } } close(connfd); /* parent closes connected socket */ }