간단한 클라이언트 서버 투사 시뮬레이션

9838 단어 서버
다음은 간단한 클라이언트 서버 투사 시뮬레이션 과정을 시뮬레이션했다.클라이언트 영상 서버는 데이터를 보내고 서버는 데이터를 받아들인 후 클라이언트 컴퓨터로 보낸다.클라이언트에서 출력합니다.

필요한 함수:


네트워크 방면
서버
socket(AF_INET,SOCK_STREAM,0);  AF_INET IPV4,SOCK_STREAM ,0 。 



bind(sockdf,(struct sockaddr*)servaddr,sizeof(servaddr));    。



listen(listenfd,1024);    , 1024 



accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);  , , 。



close(connfd);    

클라이언트
sockfd = socket(AF_INET,SOCK_STREAM,0);  



connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));  , 

입출력
fgets(sendline,MAXLINE,stdin);    sendline , 



fputs(recvline,stdout);    recvline stdout 



read(sockfd,recvline,MAXLINE);    sockfd recvline 



write(sockfd,sendline,strlen(sendline));    sockfd sendline 

서버 측 코드:

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <strings.h>

#define SERV_PORT 9877

#define LISTENQ 1024

#define MAXLINE 1024



int main(int argc,char ** argv){

    int            listenfd,connfd;

    pid_t        childpid;

    socklen_t    clilen;

    char         buf[MAXLINE];

    int         n;

    struct sockaddr_in    cliaddr,servaddr;

    listenfd = socket(AF_INET,SOCK_STREAM,0);

    

    bzero(&servaddr,sizeof(servaddr));

    servaddr.sin_family = AF_INET;

    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    servaddr.sin_port = htons(SERV_PORT);



    bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

    listen(listenfd,LISTENQ);



    for( ; ; ){

        clilen = sizeof(cliaddr);

        connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);

        if((childpid = fork()) == 0){

            close(listenfd);

            while((n=read(connfd,buf,MAXLINE)) > 0){

                printf("from client:%s",buf);

                write(connfd,buf,n);

                int i=0;

                for(i=0;i<MAXLINE;i++){

                    buf[i] = '\0';

                }

            }

            exit(0);

        }

        close(connfd);

    }

}

클라이언트 엔드 코드:

#include <stdio.h>

#include <stdlib.h>

#include <netinet/in.h>

#include <strings.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define MAXLINE 1024

int main(int argc, char const *argv[])

{

    int                    sockfd;

    struct     sockaddr_in    servaddr;



    char sendline[MAXLINE],recvline[MAXLINE];



    if(argc != 2)

        printf("error! to clien IP
"); sockfd = socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(9877); inet_pton(AF_INET,argv[1],&servaddr.sin_addr); connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); while(fgets(sendline,MAXLINE,stdin) != NULL){ write(sockfd,sendline,strlen(sendline)); //fflush(stdin); read(sockfd,recvline,MAXLINE); //printf("from server:%s
", recvline);
fputs(recvline,stdout); int i; for(i=0;i<MAXLINE;i++){ recvline[i] = '\0'; sendline[i] = '\0'; } } exit(0); }

매번 데이터를 발송한 후 서버 측의buf와 클라이언트 측의sendlinerecvline은 모두 지난번 낡은 데이터를 가지고 있기 때문에 매번 한 번씩 값'\0'을 부여하여 지난번 데이터가 이번 데이터에 영향을 미치지 않도록 보증합니다.

실행 결과


터미널에서 실행:
gcc -Wall -o serv serv.c



./serv

터미널 추가 실행:
gcc -Wall -o clien clie.c



./clie 127.0.0.1

클라이언트 엔드에서 데이터 전송
[xingoo@localhost tcpip]$ ./clie 127.0.0.1

ffffff

ffffff

dd

dd

gg

gg

hello

hello

heiheieieihehi

heiheieieihehi

fdafdasfdasfdasfdasfdas

fdafdasfdasfdasfdasfdas

d

d

서버 측 수신
[xingoo@localhost tcpip]$ ./serv

from client:ffffff

from client:dd

from client:gg

from client:hello

from client:heiheieieihehi

from client:fdafdasfdasfdasfdasfdas

from client:d

좋은 웹페이지 즐겨찾기