|
一个模拟telnet功能的小测试,用了一个管道,比Hello World的代码稍多一点,贴出来供大家批评.算来Gameres的第一贴吧.
其中的头文件就不那出来现丑了.呵呵,就是包了几个其他的头文件.
////////////////////////////////////////////////////////////////////
// tiny telnet test. server
////////////////////////////////////////////////////////////////////
#include "common_server_header.h"
int main(int argc, char **argv)
{
FILE *pPipeDesc;
struct sockaddr_in stListenAddr;
struct sockaddr_in stJobAddr;
int nListenDesc;
int nJobDesc;
int nAddrSize;
char pszBuffer[4096];
int nRC;
int i;
nListenDesc = socket(AF_INET, SOCK_STREAM, 0);
if (nListenDesc == -1) {
perror("socket");
return COMMON_SERVER_ERROR;
}
bzero(&stListenAddr, sizeof(stListenAddr));
stListenAddr.sin_family = AF_INET;
stListenAddr.sin_addr.s_addr = INADDR_ANY;
stListenAddr.sin_port = htons(COMMON_SERVER_PORT);
nRC = bind(nListenDesc, (struct sockaddr *)&stListenAddr,
sizeof(stListenAddr));
if (nRC == -1) {
perror("bind");
return COMMON_SERVER_ERROR;
}
nRC = listen(nListenDesc, 20);
if (nRC == -1) {
perror("listen");
return COMMON_SERVER_ERROR;
}
puts("Accepting connections ...\n");
nAddrSize = sizeof(stJobAddr);
while (1) {
nJobDesc = accept(nListenDesc,
(struct sockaddr *)&stJobAddr, &nAddrSize);
if (nJobDesc == -1) {
perror("accept");
break;
}
while (1) {
nRC = recv(nJobDesc, pszBuffer, sizeof(pszBuffer), 0);
if (nRC <=0) {
perror("Recv");
break;
}
puts(pszBuffer);
pPipeDesc = popen(pszBuffer, "r");
for (i = 0; !feof(pPipeDesc); i++) {
if (i >= 4096) i = 0;
pszBuffer = getc(pPipeDesc);
}//__for__read__pipe__
pszBuffer[i - 1] = 0;
nRC = send(nJobDesc, pszBuffer, sizeof(pszBuffer), 0);
if (nRC <= 0) {
perror("Read");
break;
}
pclose(pPipeDesc);
}//__while__recv__send__
}//__while__accept__
close(nJobDesc);
return COMMON_SERVER_OK;
}
///////////////////////////////////////////////////////////////////
// tiny telnet test. Client
///////////////////////////////////////////////////////////////////
#include "common_server_header.h"
int main(int argc, char **argv)
{
struct hostent *pServerEnt;
struct sockaddr_in stAddr;
char *pServerName = "192.168.0.6";
int nSockDesc;
char Buffer[4096];
int nRC;
pServerEnt = gethostbyname(pServerName);
if (NULL == pServerEnt) {
perror("resolving host");
return COMMON_SERVER_ERROR;
}
bzero(&stAddr, sizeof(stAddr));
stAddr.sin_family = AF_INET;
stAddr.sin_addr.s_addr =
((struct in_addr *)(pServerEnt->h_addr))->s_addr;
stAddr.sin_port = htons(COMMON_SERVER_PORT);
nSockDesc = socket(AF_INET, SOCK_STREAM, 0);
if (nSockDesc == -1) {
perror("socket");
return COMMON_SERVER_ERROR;
}
nRC = connect(nSockDesc, (void *)&stAddr, sizeof(stAddr));
if (nRC == -1) {
perror("connect");
return COMMON_SERVER_ERROR;
}
//strcpy(Buffer, "Client Package\n");
while (1) {
for (nRC = 0;; nRC++) {
Buffer[nRC] = getchar();
if (Buffer[nRC] == '\n')
break;
}
puts(Buffer);
nRC = send(nSockDesc, Buffer, sizeof(Buffer), 0);
if (nRC <= 0) {
perror("send");
continue;
}
memset(Buffer, 0, sizeof(Buffer));
nRC = recv(nSockDesc, Buffer, sizeof(Buffer), 0);
if (nRC <=0) {
perror("recv");
continue;
}
if (strlen(Buffer) > 2)
puts(Buffer);
}
close(nSockDesc);
return COMMON_SERVER_OK;
}
|
|