69,371
社区成员
发帖
与我相关
我的任务
分享
close(iConnSocket);
void sigChildFun(int sigNO)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
{
NULL;
}
return;
}
int main()
{
sockaddr_in servAddr;
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = INADDR_ANY;
servAddr.sin_port = htons(8765);
int iListenSocket = socket(AF_INET, SOCK_STREAM, 0);
bind(iListenSocket, (sockaddr *)&servAddr, sizeof(servAddr));
listen(iListenSocket,5);
signal(SIGCHLD, sigChildFun);
while(1)
{
sockaddr_in clientAddr;
socklen_t iSize = sizeof(clientAddr);
memset(&clientAddr, 0, sizeof(clientAddr));
int iConnSocket = accept(iListenSocket,(sockaddr*)&clientAddr, &iSize);
if(iConnSocket < 0)
{
if(errno == EINTR || errno == ECONNABORTED)
{
continue;
}
else
{
printf("accept error, server\n");
return -1;
}
}
int tmpPid = fork();
if(tmpPid == 0)
{
close(iListenSocket); // 子进程让监听socket的计数减1, 并非直接关闭监听socket
char szBuf[1024] = {0};
snprintf(szBuf, sizeof(szBuf), "server pid[%u], client ip[%s]", getpid(), inet_ntoa(clientAddr.sin_addr));
write(iConnSocket, szBuf, strlen(szBuf) + 1);
while(1)
{
if(read(iConnSocket, szBuf, 1) <= 0)
{
close(iConnSocket); // 子进程让通信的socket计数减1
return -2; // 子进程退出
}
}
close(iConnSocket); // 子进程让通信的socket计数减1
return 0; // 子进程退出
}
close(iConnSocket); // 不知道为何,父进程再次让通信的socket计数减1,之前子进程已经调用过了
}
getchar();
close(iListenSocket); // 父进程让监听socket计数减1, 此时会关掉监听socket(因为之前子进程已经有此操作)
return 0;
}
客户端程序为:
int main()
{
int sockClient = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.s_addr = inet_addr("10.100.70.140");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8765);
connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
char szBuf[2048] = {0};
int iRet = recv(sockClient, szBuf, sizeof(szBuf) - 1 , 0);
printf("msg from server: %s\n", szBuf);
getchar();
close(sockClient);
return 0;
}
close(iConnSocket);