링크 ux 아래 socket tcp Server c 언어 작성 (단일 프로 세 스, 다 중 프로 세 스, 다 중 스 레 드 구현)

22489 단어 네트워크linux
TCP 교체 서버 는 클 라 이언 트 의 연결 을 받 은 다음 에 처리 하고 이 클 라 이언 트 의 모든 요청 을 완료 한 후에 연결 을 끊 습 니 다.TCP 교체 서버 는 한 번 에 한 클 라 이언 트 의 요청 만 처리 할 수 있 습 니 다. 이 클 라 이언 트 의 모든 요청 이 만족 한 후에 만 서버 는 뒤의 요청 을 계속 할 수 있 습 니 다.만약 에 한 클 라 이언 트 가 서버 를 차지 하고 놓 지 않 을 때 다른 클 라 이언 트 가 작 동 하지 못 하기 때문에 TCP 서버 는 교체 서버 모델 을 사용 하지 않 습 니 다.
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; }

좋은 웹페이지 즐겨찾기