다중 프로세스 TCP 서버의 간단한 구현
10788 단어 인터넷
#include
#include
#include
#include
#include
#include
#include
#include
#define _BACKLOG_ 10
int CreateSock(char *ip, int port)
{
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
printf("socket error
");
exit(1);
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET, ip, &server_addr.sin_addr);
if(bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
{
printf("bind error
");
close(sock);
exit(2);
}
if(listen(sock, _BACKLOG_) < 0)
{
printf("listen error
");
close(sock);
exit(3);
}
return sock;
}
void Service(int client_sock)
{
for(;;)
{
char buf[1024];
buf[0] = 0;
int s = read(client_sock, buf, sizeof(buf));
if(s > 0)
{
buf[s-1] = 0;
if(strncasecmp(buf, "quit", 4) == 0)
{
printf("client quit!
");
exit(0);
}
printf("client:%s
", buf);
write(client_sock, buf, strlen(buf));
}
}
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("%s [addr]:[port]
", argv[0]);
exit(1);
}
int sock = CreateSock(argv[1], atoi(argv[2]));
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
while(1)
{
printf("wait connect!
");
socklen_t len = 0;
int client_sock = accept(sock, (struct sockaddr*)&client_addr, &len);
if(client_sock < 0)
{
printf("accept arror
");
continue;
}
char buf_ip[INET_ADDRSTRLEN];
buf_ip[0] = 0;
inet_ntop(AF_INET, &client_addr, buf_ip, sizeof(buf_ip));
printf("get connect, ip is:%s, port is: %d
", buf_ip, ntohs(client_addr.sin_port));
pid_t pid = fork();
if(pid < 0)
{
printf("fork error");
continue;
}
else if(pid == 0)
{
pid_t pid = fork();
if(pid < 0)
{
printf("fork error");
continue;
}
else if(pid > 0)
exit(4);
}
else
{
wait(NULL);
continue;
}
Service(client_sock);
}
close(sock);
return 0;
}
클라이언트:client.c
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("%s [addr]:[port]
", argv[0]);
return 1;
}
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
printf("socket error
");
return 2;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
if(connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
{
printf("connect error
");
close(sock);
return 3;
}
printf("connect success!
");
while(1)
{
char buf[1024];
memset(buf, 0x00, sizeof(buf));
printf("please input:>");
fflush(stdout);
read(0, buf, sizeof(buf));
write(sock, buf, strlen(buf));
if(strncasecmp(buf, "quit", 4) == 0)
{
printf("client quit!
");
break;
}
int s = read(sock, buf, sizeof(buf));
if(s > 0)
{
buf[s] = 0;
printf("server:%s
", buf);
}
}
close(sock);
return 0;
}
동일한 LAN에서 여러 고객이 동일한 서버에 동시에 액세스할 수 있음
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
"5G"의 비즈니스 모델ICT 비즈니스는 "지금, 미국에서 일어나고 있는 일이 3~5년 후에 일본에서 일어난다""지금 중국이 가장 진행되고 있어 그것을 쫓는 일본"이라고 생각되기 쉽지만, 5G의 비즈니스는 그렇다고는 말할 수없는 상황에 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.