티스토리 뷰

5장 연습문제

//Client
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
#include<string.h>

#define MAXLINE 512
#define PORTNUM 5000

int main()
{
   .....
    while (1) {
       ....

        addrlen = sizeof(peeraddr);
        int result;

        retVal = recvfrom(sockfd, (char*)&result, sizeof(int), 0, (SOCKADDR*)&peeraddr, &addrlen);
        if (retVal == SOCKET_ERROR) {
            err_quit("Recvfrom");
            break;
        }
        
        if (memcmp(&peeraddr, &sockaddr, sizeof(peeraddr))) {
            printf("[오류]잘못된 데이터입니다\n");
            continue;
        }
        printf("입력 받은 데이터 : %d\n", result);
    }
	....
}
//Server
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>

#define MAXLINE 512
#define PORTNUM 5000

int main()
{
    .....
    while (1)
    {
        addrlen = sizeof(clientaddr);
        int retVal = ::recvfrom(sockfd, buf, MAXLINE, 0, (SOCKADDR*)&clientaddr, &addrlen);
        if (retVal == SOCKET_ERROR) {
            err_quit("RecvFrom");
            continue;
        }
        buf[retVal] = '\0';
        char* ptr = strtok(buf, " ");
        while (ptr != NULL) {
            result += atoi(ptr);
            ptr = strtok(NULL, " ");
        }
        printf("실행중");
        printf("[UPD%s %d] %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), result);
        
        retVal = sendto(sockfd, (char*)&result, sizeof(int), 0, (SOCKADDR*)&clientaddr, sizeof(clientaddr));
        ...
    }
	...
}

 


6장 연습문제

//Client
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
#include<string.h>

#define MAXLINE 512
#define PORTNUM 5000

void err_quit(const char* msg) {
    LPVOID lpMsgBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, WSAGetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf, 0, NULL);
    printf("[%s] %s\n", msg, (char*)lpMsgBuf);
    LocalFree(lpMsgBuf);
    exit(1);
} 

int main()
{
    WSADATA wsaData;


    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("dlload error\n");
        return 1;
    }

    SOCKET sockfd;
    int addrlen, len;
    char buf[MAXLINE];
    struct sockaddr_in sockaddr, peeraddr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == INVALID_SOCKET)
    {
        printf("socket create error\n");
        return 1;
    }

    ZeroMemory(&sockaddr, sizeof(sockaddr));
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(PORTNUM);
    sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int fsize, nsize = 0;
    FILE* file = fopen("Question.txt", "rb");
    fseek(file, 0, SEEK_END);
    fsize = ftell(file);
    fseek(file, 0, SEEK_SET);
    
    while (nsize != fsize) {
        int fpsize = fread(buf, 1, MAXLINE, file);
        nsize += fpsize;
        printf("%d 데이터 전송\n", fpsize);
        while (1) {
            int retVal = sendto(sockfd, buf, fpsize, 0, (SOCKADDR*)&sockaddr, sizeof(sockaddr));
            sendto(sockfd, (char*)&retVal, sizeof(int), 0, (SOCKADDR*)&sockaddr, sizeof(sockaddr));
            addrlen = sizeof(peeraddr);
            //문자열 길이와 문자열 두개를 전송
            
            recvfrom(sockfd, (char*)&retVal, sizeof(int), 0, (SOCKADDR*)&peeraddr, &addrlen);
            //전달한 문자열 길이와 전달받은 문자열 길이의 두 값을 비교
            //같으면 완료
            if (retVal == fpsize) {
                printf("데이터 안정적으로 전달 완료\n");
                break;
            }
            //실패시 다시 전송
            else {
                printf("데이터 전송 실패, 재시도\n");
                continue;
            }
        }
    }
    sendto(sockfd, NULL, 0, 0, (SOCKADDR*)&sockaddr, sizeof(sockaddr));

    printf("소켓 통신 종료");
    fclose(file);
    closesocket(sockfd);
    WSACleanup();

    return 0;
}
//Server
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>

#define MAXLINE 512
#define PORTNUM 5000

void err_quit(const char* msg) {
    LPVOID lpMsgBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, WSAGetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf, 0, NULL);
    printf("[%s] %s", msg, (char*)lpMsgBuf);
    LocalFree(lpMsgBuf);
}

int main()
{
    WSADATA wsaData;
    SOCKET sockfd;
    int addrlen;
    int len = 0;
    WSAEVENT sEvent;
    struct sockaddr_in sockaddr,clientaddr;
    HANDLE hThread;
    char buf[MAXLINE+1];

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("dlload error\n");
        return 1;
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == INVALID_SOCKET)
    {
        printf("socket create error\n");
        return 1;
    }

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(PORTNUM);
    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (::bind(sockfd, (SOCKADDR*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) err_quit("Bind");

    int retVal = MAXLINE;
    int check = 0;
    FILE* file = fopen("Question.txt", "wb");

    while (retVal != 0) {
        addrlen = sizeof(clientaddr);
        retVal = recvfrom(sockfd, buf, MAXLINE, 0, (SOCKADDR*)&clientaddr, &addrlen); 
        //문자열 전달 받음
        if (retVal == SOCKET_ERROR) {
            err_quit("Recvfrom");
            break;
        }
        else if (retVal == 0)
            break;
        recvfrom(sockfd, (char*)&check, sizeof(int), 0, (SOCKADDR*)&clientaddr, &addrlen);
        //문자열 길이 전달받음
        //두개를 비교하여 같으면 입력받은 문자열 길이 재정송
        if (retVal == check) {
            sendto(sockfd, (char*)&retVal, sizeof(int), 0, (SOCKADDR*)&clientaddr, sizeof(clientaddr));
            printf("[UDP %s %d] : %d 데이터 전달받음\n",
                inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), retVal);
        }
        //실패시 다시 요청
        else {
        	sendto(sockfd, NULL, 0, 0, (SOCKADDR*)&clientaddr, sizeof(clientaddr));
            continue;
        }
        //입력 받은 문자열 파일에 쓰기
        fwrite(buf, sizeof(char), retVal, file);
    }
    
    printf("소켓 통신이 종료되었습니다.");
    closesocket(sockfd);
    WSACleanup();
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함