티스토리 뷰
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;
}
'서버 공부 > 네트워크' 카테고리의 다른 글
GUI 멀티쓰레드 소켓 프로그래밍(TCP) 2 - 호스트이름 구하기 추가 (0) | 2022.07.07 |
---|---|
GUI 멀티쓰레드 소켓 프로그래밍(TCP) (0) | 2022.07.07 |
멀티 쓰레드를 활용한 서버/클라이언트 기본 통신 (0) | 2022.07.05 |
소켓 네트워크 프로그래밍) 데이터 전송 방식 -> 고정 + 가변 길이 데이터 전송 (0) | 2022.07.04 |
소켓 네트워크 프로그래밍) 데이터 전송 방식 -> 가변 길이 데이터 전송 (0) | 2022.07.04 |
댓글