TCP/IP 소켓프로그래밍 기초적인거 질문 받아주실 수 있나요?
글쓴이: 201413694 / 작성시간: 수, 2018/09/12 - 3:05오후
과제떄문에 TCP/IP소켓프로그래밍을 독학하게 되었습니다.
서버와 클라이언트에 대한 소스코드는 아래와 같습니다. 윈도우 운영체제에 C언어로 작성했어요
로컬호스트에서 제 아이피 또는 루프백을 이용해 cmd창 2개를 띄워서 실행하면 서버와 클라이언트 모두 잘 받았습니다.
그러나 과제의 핵심사항이 장비(회사에서 지급)와 PC를 연결해서
PC에서 장비로 패킷(A003A0030101000E)를 보내서 162바이트를 받는것입니다.
그러나 장비와 PC를 연결하면 소켓통신이 반응하지않습니다.
cmd를 쓸때 클라이언트응용프로그램 과 장비ip 및 포트를 넣었을떄 추가적인 메시지가 안뜹니다.
장비와 연결했을떄 핑은 나왔고
윈7에 알맞게 방화벽도 특정포트 허용했습니다.
답변부탁 드립니다.
//서버 순서:원속초기화-소켓생성-(데이터통신:bind,listen,accept)-소켓해제-원속종료 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define BUFSIZE 2018 void ErrorHandling(char* message); int main(int argc, char *argv[]) { char hex[] = "A003A0030101000E"; char *ptr; long value; value = strtoul(hex, &ptr, 16); SOCKET sock, clientsock; WSADATA wsa; struct sockaddr_in sockinfo, clientinfo; int clientsize; char message[] = "TCP/IP 소켓 프로그래밍"; char buffer[BUFSIZE] = { 0 }; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) ErrorHandling("Winsock DLL 실패"); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) ErrorHandling("Soecket 생성 실패"); memset(&sockinfo, 0, sizeof(SOCKADDR_IN)); sockinfo.sin_family = AF_INET; //주소체계 AF_INET,AF_INET6,AF_LOCAL sockinfo.sin_port = htons(argv[1]); sockinfo.sin_addr.s_addr = htonl(INADDR_ANY); //ip를 지정함 if (bind(sock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR) ErrorHandling("bine 실패"); if (listen(sock, 5) == SOCKET_ERROR) //[성공시 0,실패시 SOCKET_ERROR] ErrorHandling("listen 실패"); printf("클라이언트로부터 접속을 기다리고 있습니다...\n"); clientsize = sizeof(clientinfo); clientsock = accept(sock, (SOCKADDR*)&clientinfo, &clientsize); if (clientsock == INVALID_SOCKET) //소켓핸들값이라서 INVALID_SOCKET로 확인 ErrorHandling("accept 실패"); send(clientsock, message, sizeof(message), 0); send(clientsock, hex, sizeof(hex), 0); closesocket(sock); closesocket(clientsock); printf("성공\n"); WSACleanup(); } void ErrorHandling(char *message) { WSACleanup(); fputs(message, stderr); fputc('\n', stderr); _getch(); exit(1); }
------------------------------
//클라이언트 순서:초기화-소켓생성-connect-소켓해제-원속 종료 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define BUFSIZE 2048 void ErrorHandling(char *message); int main(int argc, char *argv[]) { char hex[] = "A003A0030101000E"; char *ptr; long value; value = strtoul(hex, &ptr, 16); SOCKET clientsock; WSADATA wsa; struct sockaddr_in sockinfo; char message[BUFSIZE]; int strlen; if (argc != 3) { printf("Usage : %s <IP> <PORT> \n", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) ErrorHandling("Winsock DLL 실패"); clientsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientsock == INVALID_SOCKET) ErrorHandling("Soecket 생성 실패"); memset(&sockinfo, 0, sizeof(sockinfo)); sockinfo.sin_family = AF_INET; sockinfo.sin_port = htons(atoi(argv[2])); sockinfo.sin_addr.s_addr = inet_addr(argv[1]); if (connect(clientsock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR) ErrorHandling("accept 실패"); strlen = recv(clientsock, message, sizeof(message) - 1, 0); if (strlen == -1) // recv 함수 반환 값이 -1이면 메시지 수신 실패 ErrorHandling("message 실패"); strlen = recv(clientsock, hex, sizeof(hex) - 1, 0); if(strlen == -1) ErrorHandling("전송 오류"); printf("받은 데이터는 16진수로 0x%08X 입니다.\n", htons(strlen)); printf("받은 데이터는 십진수로 %d 입니다.\n", htons(strlen)); printf(" Server say: %s \n", message); closesocket(clientsock); WSACleanup(); } void ErrorHandling(char *message) { WSACleanup(); fputs(message, stderr); fputc('\n', stderr); _getch(); exit(1); }
Forums:
떄문에 ? 때문에 ?
떄문에 ? 때문에 ?
사소한 오타 때문에 질문의 핵심에서 답변이 멀어질 수 있어요.
kldp 에 소스코드 넣을 때는 아래 링크 참고하세요.
https://kldp.org/node/158191
세벌 https://sebuls.blogspot.kr/
감사합니다
감사합니다
wireshark로 실제 데이터가 왔다 갔다 하는지
wireshark로 실제 데이터가 왔다 갔다 하는지 확인해 보세요.
참고해보세요.
구름 IDE - 웹 컴파일러
https://www.goorm.io/
구름 IDE - 웹 컴파일러 사용방법
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=278&MAEULNO=20&no=32422&page=1
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기