#include#include #pragma comment(lib, "wsock32.lib") void main() { SOCKET s, cs; WSADATA wsaData; struct sockaddr_in sin; struct sockaddr_in cli_addr; int size = sizeof(cli_addr); char data[1024]={0,}; FILE *fp; int ret; int nTimeOut = 3000; if( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ){ printf("WSAStartup 실패, 에러코드 = %d\n", WSAGetLastError()); return; } s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s==INVALID_SOCKET){ printf("소켓 생성 실패, 에러코드 : %d\n", WSAGetLastError()); WSACleanup(); return; } sin.sin_family = AF_INET; sin.sin_port = htons(10000); sin.sin_addr.s_addr = htonl(ADDR_ANY); if( bind(s, (struct sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){ printf("바인드 실패, 에러코드 = %d\n", WSAGetLastError()); closesocket(s); WSACleanup(); return; } if( listen(s, SOMAXCONN) != 0){ printf("리슨 실패, 에러코드 = %d\n", WSAGetLastError()); closesocket(s); WSACleanup(); return; } puts("클라이언트의 연결을 기다리고 있습니다...\n"); cs = accept(s, (struct sockaddr*)&cli_addr, &size); if(cs == INVALID_SOCKET) { printf("소켓생성실패, 에러코드 : %d\n", WSAGetLastError()); WSACleanup(); return; } fp = fopen("c:\\recv.txt", "w+b"); if(fp==NULL){ perror("파일생성에러"); closesocket(cs); closesocket(s); WSACleanup(); return; } setsockopt(cs, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, size); while(1){ ret = recv(cs, data, 1024, 0); if(ret == 0) break; if(ret == SOCKET_ERROR){ printf("수신에러, 에러코드 : %d\n", WSAGetLastError()); closesocket(cs); closesocket(s); WSACleanup(); fclose(fp); return; } fwrite(data, 1, ret, fp); printf("%d bytes를 수신하였습니다.\n", ret); } fclose(fp); shutdown(s, SD_BOTH); if(closesocket(s)!=0 || closesocket(cs)!=0){ printf("소켓 제거 실패, 에러코드 = %u\n", WSAGetLastError()); WSACleanup(); return; } if(WSACleanup() != 0){ printf("WSACleanup 실패, 에러코드 = %u\n", WSAGetLastError()); return; } }
Tip&Skill