링크 ux 아래 socket tcp Server c 언어 작성 (단일 프로 세 스, 다 중 프로 세 스, 다 중 스 레 드 구현)
tcp 서버 엔 드 프레임 워 크 1. tcp 소켓 만 들 기 2. 바 인 딩 소켓 3. 감청 소켓 4. accept () 차단 대기 5. 클 라 이언 트 요청 처리 6. 연결 소켓 닫 기 7. 감청 소켓 tcp 클 라 이언 트 프레임 워 크 닫 기 1. tcp 소켓 만 들 기 2. connect () 호출서버 연결 3. 서버 에서 되 돌아 오 는 정 보 를 처리 합 니 다. 클 라 이언 트 가 고정된 엔 드 번호 가 필요 하지 않 기 때문에 스토리 보드 bid () 를 바 꿀 필요 가 없습니다. 클 라 이언 트 의 엔 드 번호 가 커 널 에서 12163 번 으로 분 배 됩 니 다.클 라 이언 트 가 스토리 보드 바 인 드 () 를 바 꾸 는 것 을 허용 하지 않 는 것 은 아 닙 니 다. 다만 스토리 보드 바 인 드 () 를 바 꾸 지 않 아 도 됩 니 다. 서버 가 스토리 보드 바 인 드 () 를 바 꾸 지 않 으 면 커 널 은 서버 에 감청 단 을 할당 합 니 다. 서버 를 시작 할 때마다 엔 드 가 12060 번 이 아 닙 니 다. 클 라 이언 트 가 서버 를 연결 하려 면 12231 번 이 귀 찮 습 니 다.단일 프로 세 스 server. c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _PORT_ 9999
#define _BACKLOG_ 10
int main()
{
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
printf("socket()
");
}
struct sockaddr_in server_socket;
struct sockaddr_in socket;
bzero(&server_socket,sizeof(server_socket));
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=htonl(INADDR_ANY);
server_socket.sin_port=htons(_PORT_);
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)
{
printf("bind()
");
close(sock);
return 1;
}
if(listen(sock,_BACKLOG_)<0)
{
printf("listen()
");
close(sock);
return 2;
}
printf("success
");
for(;;)
{
socklen_t len=0;
int client_sock=accept(sock,(struct sockaddr*)&socket,&len);
if(client_sock<0)
{
printf("accept()
");
return 3;
}
char buf_ip[INET_ADDRSTRLEN];
memset(buf_ip,'\0',sizeof(buf_ip));
inet_ntop(AF_INET,&socket.sin_addr,buf_ip,sizeof(buf_ip));
printf("get connect
");
while(1)
{
char buf[1024];
memset(buf,'\0',sizeof(buf));
read(client_sock,buf,sizeof(buf));
printf("client:# %s
",buf);
printf("server:$ ");
memset(buf,'\0',sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(strncasecmp(buf,"quit",4)==0)
{
printf("quit
");
break;
}
write(client_sock,buf,strlen(buf)+1);
printf("wait...
");
}
close(client_sock);
}
close(sock);
return 0;
}
다 중 프로 세 스 는 어떻게 단일 프로 세 스 의 코드 를 다 중 프로 세 스 의 코드 로 바 꿉 니까?fork () 함 수 를 호출 하여 하위 프로 세 스 를 만 들 고 모든 클 라 이언 트 의 요청 처리 내용 을 하위 프로 세 스에 놓 습 니 다.리 눅 스 환경 에서 다 중 프로 세 스 의 응용 이 매우 많은 데 그 중에서 가장 중요 한 것 은 네트워크 / 클 라 이언 트 서버 이다.다 중 프로 세 스 서버 는 클 라 이언 트 가 요청 할 때 서버 가 클 라 이언 트 요청 을 하위 프로 세 스 로 처리 합 니 다.부모 프로 세 스 가 다른 고객 의 요청 을 계속 기다 리 고 있 습 니 다.이런 방법의 장점 은 고객 이 요청 이 있 을 때 서버 가 고객 을 신속하게 처리 할 수 있다 는 것 이다. 특히 고객 서버 의 상호작용 시스템 에서.TCP 서버 에 대해 서 는 클 라 이언 트 와 서버 의 연결 이 바로 닫 히 지 않 을 수 있 습 니 다. 클 라 이언 트 가 특정한 데 이 터 를 제출 한 후에 닫 을 수 있 습 니 다. 그 동안 서버 의 프로 세 스 가 막 힐 수 있 기 때문에 이 때 운영 시스템 은 다른 클 라 이언 트 서비스 프로 세 스 를 예약 할 수 있 습 니 다. 이것 은 순환 서버 에 비해 서비스 성능 을 크게 향상 시 켰 습 니 다.server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _PORT_ 9999
#define _BACKLOG_ 10
int main()
{
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
printf("socket()
");
}
struct sockaddr_in server_socket;
struct sockaddr_in socket;
bzero(&server_socket,sizeof(server_socket));
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=htonl(INADDR_ANY);
server_socket.sin_port=htons(_PORT_);
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)
{
printf("bind()
");
close(sock);
return 1;
}
if(listen(sock,_BACKLOG_)<0)
{
printf("listen()
");
close(sock);
return 2;
}
printf("success
");
for(;;)
{
socklen_t len=0;
int client_sock=accept(sock,(struct sockaddr*)&socket,&len);
if(client_sock<0)
{
printf("accept()
");
return 3;
}
char buf_ip[INET_ADDRSTRLEN];
memset(buf_ip,'\0',sizeof(buf_ip));
inet_ntop(AF_INET,&socket.sin_addr,buf_ip,sizeof(buf_ip));
printf("get connect
");
pid_t fd=fork();
if(fd<0)
printf("fork()
");
if(fd==0)
{
close(sock);//
printf("port=%d,ip=%s
",ntohs(socket.sin_port),buf_ip);
while(1)
{
char buf[1024];
memset(buf,'\0',sizeof(buf));
read(client_sock,buf,sizeof(buf));
printf("client:# %s
",buf);
printf("server:$ ");
memset(buf,'\0',sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(strncasecmp(buf,"quit",4)==0)
{
printf("quit
");
break;
}
write(client_sock,buf,strlen(buf)+1);
printf("wait...
");
}
close(fd);
}
else if(fd>0)
{
close(fd);
}
}
close(sock);
return 0;
}
다 중 스 레 드 다 중 스 레 드 는 다 중 프로 세 스 의 처리 방식 과 유사 합 니 다. 모두 새로운 스 레 드 를 만 듭 니 다. 클 라 이언 트 가 요청 할 때 새로 만 든 스 레 드 로 처리 합 니 다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _PORT_ 9999
#define _BACKLOG_ 10
void *fun(void* arg)
{
int client_sock = (int)arg;
while(1)
{
char buf[1024];
memset(buf,'\0',sizeof(buf));
read(client_sock,buf,sizeof(buf));
printf("client:# %s
",buf);
printf("server:$ ");
memset(buf,'\0',sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(strncasecmp(buf,"quit",4)==0)
{
printf("quit
");
break;
}
write(client_sock,buf,strlen(buf)+1);
printf("wait...
");
}
close(client_sock);
}
int main()
{
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
printf("socket()
");
}
struct sockaddr_in server_socket;
struct sockaddr_in socket;
pthread_t thread_id;
bzero(&server_socket,sizeof(server_socket));
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=htonl(INADDR_ANY);
server_socket.sin_port=htons(_PORT_);
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)
{
printf("bind()
");
close(sock);
return 1;
}
if(listen(sock,_BACKLOG_)<0)
{
printf("listen()
");
close(sock);
return 2;
}
printf("success
");
for(;;)
{
socklen_t len=0;
int client_sock=accept(sock,(struct sockaddr*)&socket,&len);
if(client_sock<0)
{
printf("accept()
");
return 3;
}
char buf_ip[INET_ADDRSTRLEN];
memset(buf_ip,'\0',sizeof(buf_ip));
inet_ntop(AF_INET,&socket.sin_add,buf_ip,sizeof(buf_ip));
printf("get connect,ip is%s
",buf_ip);
printf("port=%d
",ntohs(socket.sin_port));
pthread_create(&thread_id, NULL, (void *)fun, (void *)client_sock);
pthread_detach(thread_id);
}
close(sock);
return 0;
}
어떤 서버 든 클 라 이언 트 는 같은 client. c 입 니 다.
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 9999
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("Usage:client IP
");
return 1;
}
char *str=argv[1];
char buf[1024];
memset(buf,'\0',sizeof(buf));
struct sockaddr_in server_sock;
int sock = socket(AF_INET,SOCK_STREAM,0);
bzero(&server_sock,sizeof(server_sock));
server_sock.sin_family=AF_INET;
inet_pton(AF_INET,str,&server_sock.sin_addr);
server_sock.sin_port=htons(SERVER_PORT);
int ret=connect(sock,(struct sockaddr *)&server_sock,sizeof(server_sock));
if(ret<0)
{
printf("connect()
");
return 1;
}
printf("connect success
");
while(1)
{
printf("client:# ");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
write(sock,buf,sizeof(buf));
if(strncasecmp(buf,"quit",4)==0)
{
printf("quit
");
break;
}
printf("wait..
");
read(sock,buf,sizeof(buf));
printf("server:$ %s
",buf);
}
close(sock);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
리눅스 입문~컴퓨터 시스템의 하드웨어의 개요와 리눅스의 주요 기능과 그 구조의 개요~별도의 기사에서 각 Linux의 기능인 프로세스 및 메모리 관리 메커니즘에 대한 자세한 내용을 요약합니다. 입력 장치, 네트워크 어댑터를 통해 컴퓨터에서 처리를 수행하도록 요청 프로세스 관리 메모리 관리 장치 조작 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.