null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
Windows 소켓 에러 모음
#c
#windows
#winsock
#socket
#error
@devpc
|
2026-05-04 12:40:02
|
GET /api/v1/nodes/456?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
0
Calls
# Windows 소켓 에러 모음 ## 들어가며 Windows에서 소켓 프로그래밍을 할 때 `<winsock2.h>`와 `<windows.h>` 조합에서 자주 나오는 에러들을 정리한다. --- ## 에러 1: windows.h와 winsock2.h 충돌 ``` error C2011: 'sockaddr' : 'struct' type redefinition ``` `<windows.h>`가 내부적으로 `<winsock.h>` (v1)을 포함하는데, `<winsock2.h>`와 타입이 충돌한다. **해결법**: `<winsock2.h>`를 `<windows.h>`보다 먼저 포함한다. ```c /* 올바른 순서 */ #include <winsock2.h> #include <windows.h> /* 또는 windows.h에서 winsock 제외 */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> ``` --- ## 에러 2: inet_addr deprecated 경고 ``` warning: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS ``` `inet_addr`는 구형 API로 deprecated되었다. ### 빠른 해결 (경고 억제) ```c #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <winsock2.h> ``` ### 올바른 해결 (신규 API 사용) ```c #include <winsock2.h> #include <ws2tcpip.h> /* inet_addr 대체 */ struct sockaddr_in addr; addr.sin_family = AF_INET; inet_pton(AF_INET, "192.168.0.1", &addr.sin_addr); /* inet_ntoa 대체 */ char ip_str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str)); ``` `inet_pton`(presentation to network)은 문자열 IP → 바이너리, `inet_ntop`(network to presentation)은 바이너리 → 문자열이다. --- ## 에러 3: WSAStartup 누락 ``` error: WSAStartup 호출 없이 소켓 함수 실행 시 WSANOTINITIALISED(10093) ``` Windows 소켓은 사용 전에 초기화가 필요하다. ```c int init_winsock(void) { WSADATA wsa; int ret = WSAStartup(MAKEWORD(2, 2), &wsa); if (ret != 0) { fprintf(stderr, "WSAStartup failed: %d\n", ret); return -1; } return 0; } void cleanup_winsock(void) { WSACleanup(); } ``` 프로그램 시작 시 `init_winsock`, 종료 시 `cleanup_winsock`을 호출한다. --- ## 에러 4: 링크 에러 — ws2_32.lib 누락 ``` LNK2019: unresolved external symbol WSAStartup ``` 컴파일은 되지만 링크가 안 된다. **해결법**: ```c /* 코드에 pragma 추가 */ #pragma comment(lib, "ws2_32.lib") /* 또는 프로젝트 설정에서 Linker → Input → Additional Dependencies → ws2_32.lib 추가 */ ``` --- ## 간단한 TCP 클라이언트 뼈대 ```c #define _WINSOCK_DEPRECATED_NO_WARNINGS #define WIN32_LEAN_AND_MEAN #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(void) { WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); SOCKET s = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server = {0}; server.sin_family = AF_INET; server.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &server.sin_addr); connect(s, (struct sockaddr *)&server, sizeof(server)); send(s, "Hello\n", 6, 0); closesocket(s); WSACleanup(); return 0; } ```
// COMMENTS
Newest First
ON THIS PAGE