일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 티몬삼겹살데이
- lua interpreter
- 중소규모택지
- #신혼부부 #결혼준비 #신혼부부희망타운신혼부부특별공급
- lua for windows
- lua setup
- TCP/IP
- C++ API
- QTcpServer
- lua install
- #부동산전자거래 #부동산전자계약 #부동산계약 #부동산전자계약방법 #부동산전자계약하는법 #부동산계약방법 #부동산중개수수료 #부동산중개수수료아끼기 #부동산복비아끼기
- 국토교통부
- file write
- 수도권주택공급
- 등록임대주택
- Lua
- 월세
- 편편집 #강남역맛집 #강남샤브샤브 #강남무한리필 #편백찜맛집 #월남쌈맛집 #샤브샤브맛집 #가성비맛집 #강남회식 #강남데이트
- file read
- 찾다죽는줄
- object
- QT TCP
- meta table
- 엑스퍼트2주년
- 전동포 #송파구전기자전거 #전동킥보드수리 #모토벨로대리점 #전기자전거판매 #전동스쿠터수리 #배터리수리 #전기자전거수리 #송파구전동킥보드 #전동이동수단
- 엑스퍼트생일축하해
- FILE TRANSFER
- 육전국밥 #강남역맛집 #24시간맛집 #소고기국밥 #육전 #모둠전 #해물파전 #강남한식 #혼밥맛집 #강남역국밥
- 순남시래기 #교대맛집 #교대역맛집 #한식맛집 #시래기국 #서울맛집 #가성비맛집 #건강한식단 #셀프반찬 #직장인맛집
- C API
- Today
- Total
Value Creator의 IT(프로그래밍 / 전자제품)
#1 TCP/IP, MODBUS TCP 예제 프로그램 본문
[새 프로젝트 만들기]
1. 프로젝트 생성
2. 소스코드 추가
[예제 코드]
1. TCP/IP SERVER
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.LIB")
#define SERVER_PORT 50000
void main(){
WSADATA wsa;
SOCKET sock, client_sock;
struct sockaddr_in sock_addr, client_addr;
int client_addr_size;
WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET; sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sock_addr.sin_port = htons( SERVER_PORT );
if(bind(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) == SOCKET_ERROR) {
closesocket(sock);
return;
}
{
char local_name[1024]; struct hostent *host_ptr = NULL;
memset(local_name, 0, 1024); gethostname(local_name, 1024);
host_ptr = gethostbyname(local_name);
printf("Server IP: %u.%u.%u.%u\n",
(unsigned char)host_ptr->h_addr_list[0][0],
(unsigned char)host_ptr->h_addr_list[0][1],
(unsigned char)host_ptr->h_addr_list[0][2],
(unsigned char)host_ptr->h_addr_list[0][3]);
printf("Port Number is %d\n", (int)SERVER_PORT);
printf("Wait client connection!\n");
}
if(listen(sock, 1) == SOCKET_ERROR) {
closesocket(sock);
return;
}
client_addr_size = sizeof(client_addr); memset(&client_addr, 0, client_addr_size);
client_sock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_size);
{
char recv_buff[1024];
char send_buff[1024];
printf("Client connected. Please send the data.\n");
memset(recv_buff, 0, 1024);
recv(client_sock, recv_buff, 1024, 0);
printf("%s\n", recv_buff);
memset(send_buff, 0 , 1024);
//sprintf(send_buff, "[server]: %s", &recv_buff[10]); 아래것으로 대체.
sprintf(send_buff, "[server]: %s", &recv_buff[10]);
printf("%s\n", send_buff);
send(client_sock, send_buff, strlen(send_buff), 0);
}
closesocket(client_sock);
closesocket(sock);
WSACleanup();
system("pause");
}
2. TCP/IP CLIENT
#include <stdlib.h>
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.LIB")
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 50000
void main()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in sock_addr;
WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = inet_addr( SERVER_IP );
sock_addr.sin_port= htons( SERVER_PORT );
{
char local_name[1024];
struct hostent *host_ptr = NULL;
memset(local_name, 0, 1024);
gethostname(local_name, 1024);
host_ptr = gethostbyname(local_name);
printf("Client IP: %u.%u.%u.%u\n",
(unsigned char)host_ptr->h_addr_list[0][0],
(unsigned char)host_ptr->h_addr_list[0][1],
(unsigned char)host_ptr->h_addr_list[0][2],
(unsigned char)host_ptr->h_addr_list[0][3]);
}
connect(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
{
char io_buff[1024];
char comm_buff[1024];
memset(io_buff, 0, 1024);
scanf("%s", io_buff);
memset(comm_buff, 0, 1024);
sprintf(comm_buff, "[client]: %s", io_buff);
printf("%s\n", comm_buff);
send(sock, comm_buff, strlen(comm_buff), 0);
memset(comm_buff, 0, 1024);
recv(sock, comm_buff, 1024, 0);
printf("%s\n", comm_buff);
closesocket(sock);
WSACleanup();
system("pause");
}
}
3. MODBUS TCP SERVER
#include stdlib.h>
#include stdio.h>
#include string.h>
#include WinSock2.h>
#pragma comment(lib, "WS2_32.LIB")
#define SERVER_PORT 50000
#define RW_READ 0x03
#define RW_WRITE 0x06
unsigned short ReverseByteOrder(unsigned short value);
unsigned short CreateCRC16(unsigned char *buff, size_t len);
void main(){
WSADATA wsa;
SOCKET sock, client_sock;
struct sockaddr_in sock_addr, client_addr;
int client_addr_size;
unsigned short reg_map[150];
memset(reg_map, 0x00, sizeof(short)*150);
reg_map[6] = 0xFE;
WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); sock_addr.sin_port = htons( SERVER_PORT );
if(bind(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) == SOCKET_ERROR){
closesocket(sock);
return;
}
if(listen(sock, 1) == SOCKET_ERROR) {
closesocket(sock);
return;
}
client_addr_size = sizeof(client_addr);
memset(&client_addr, 0, client_addr_size);
printf("Modbus TCP Simulator for Server is working!\n");
printf("Waiting Client Connection!\n");
client_sock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_size);
{
unsigned char recv_buff[8];
unsigned char *send_buff;
unsigned short address;
unsigned short value;
unsigned short len;
unsigned short i;
unsigned short crc;
recv(client_sock, (char*)recv_buff, 8, 0);
if( (recv_buff[0] == reg_map[6]) || (recv_buff[0] == 0xFF))
{
if(recv_buff[1] == RW_READ) // 0x03 read function code
{
memcpy(&address, &recv_buff[2], 2);
address = ReverseByteOrder(address);
memcpy(&len, &recv_buff[4], 2);// length
len = ReverseByteOrder(len);
send_buff = (unsigned char*)malloc( 3 + len * 2 + 2);
// ID r/w function code, length, register no to read, CRC2bytes
send_buff[0] = recv_buff[0];
send_buff[1] = RW_READ;
send_buff[2] = (unsigned char)len*2;
for(i = 0; i < len; i++)
{
value = reg_map[address + i]; //start address ~ to length
value = ReverseByteOrder(value);
memcpy( &send_buff[3 + i*2], &value, 2);// copy to send buffer
}
crc = CreateCRC16(send_buff, 3+len*2);
memcpy( &send_buff[3+len*2], &crc, 2);
send(client_sock, (char*)send_buff, 3+len*2 + 2, 0); //response sending
free(send_buff);
send_buff = NULL;
}
}
}
closesocket(client_sock);
closesocket(sock);
WSACleanup();
}
unsigned short ReverseByteOrder(unsigned short value){
unsigned short ret = 0;
((char*)&ret)[0] = ((char*)&value)[1];
((char*)&ret)[1] = ((char*)&value)[0];
return ret;
}
unsigned short CreateCRC16(unsigned char *buff, size_t len){
unsigned short crc16 = 0xFFFF;
int i = 0;
while(len--) {
crc16 ^= *buff++;
for(i=0; i<8; i++) {
if(crc16&1) {
crc16 >>= 1;
crc16 ^= 0xA001;
}
else {
crc16 >>= 1;
}
}
}
return crc16;
}
4. MODBUS TCP Device ID Read
#include <stdlib.h>
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.LIB")
//#define NE_IP "192.168.100.158"
#define NE_IP "127.0.0.1"
#define NE_PORT 50000
unsigned short CreateCRC16(char *buff, size_t len);
unsigned short ReverseByteOrder(unsigned short value);
void PrintHexa(char* buff, size_t len);
void main()
{
SOCKET sock;
WSADATA wsa;
char s_buff[8];
char r_buff[7];
struct sockaddr_in sock_addr;
int ret;
WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = inet_addr( NE_IP );
sock_addr.sin_port= htons( NE_PORT );
if(connect(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) == SOCKET_ERROR){
perror("connect()");
closesocket(sock);
WSACleanup();
return;
}
memset(s_buff, 0, 8);
memset(r_buff, 0, 7);
{
unsigned char d_id = 0xFF;
unsigned char d_rw = 0x03;
unsigned short d_addr = 6;
unsigned short d_len = 1;
unsigned short crc16;
s_buff[0] = d_id;
s_buff[1] = d_rw;
d_addr = ReverseByteOrder( d_addr );
memcpy(&s_buff[2], &d_addr, 2);
d_len = ReverseByteOrder( d_len );
memcpy(&s_buff[4], &d_len, 2);
crc16 = CreateCRC16(s_buff, 6);
//PrintHexa(&crc16, 2);
PrintHexa((char*)&crc16, 2);
memcpy(&s_buff[6], &crc16, 2);
}
PrintHexa(s_buff, 8);
if(send(sock, s_buff, 8, 0) == SOCKET_ERROR){
perror("send()");
closesocket(sock);
WSACleanup();
return;
}
ret = recv(sock, r_buff, 7, 0); if(ret == SOCKET_ERROR) { perror("recv()"); closesocket(sock); WSACleanup(); return; } PrintHexa(r_buff, ret);
printf("ID : %02X\n", (unsigned char)r_buff[4]); closesocket(sock); WSACleanup(); system("pause"); }
unsigned short ReverseByteOrder(unsigned short value) { unsigned short ret = 0; ((char*)&ret)[0] = ((char*)&value)[1]; ((char*)&ret)[1] = ((char*)&value)[0]; return ret; }
unsigned short CreateCRC16(char *buff, size_t len) { unsigned short crc16 = 0xFFFF; int i = 0; unsigned char* c_buff = (unsigned char*)buff;
while(len--) { crc16 ^= *c_buff++;
for(i=0; i<8; i++) { if(crc16&1) { crc16 >>= 1; crc16 ^= 0xA001; } else { crc16 >>= 1; } } } return crc16; }
void PrintHexa(char* buff, size_t len) { size_t i; for(i = 0; i < len; i++) { printf("%02X ", (unsigned char)buff[i]); } printf("\n"); }
5. MODBUS TCP Device ID Write
#include <stdlib.h>
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.LIB")
//IP
//#define NE_IP "192.168.100.158"
#define NE_IP "127.0.0.1"
//Port
#define NE_PORT 50000
unsigned short CreateCRC16(char *buff, size_t len);
unsigned short ReverseByteOrder(unsigned short value);
void PrintHexa(char* buff, size_t len);
void main() {
SOCKET sock; WSADATA wsa; char s_buff[8]; char r_buff[8]; struct sockaddr_in sock_addr;
WSAStartup(MAKEWORD(2,2), &wsa); sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET; sock_addr.sin_addr.s_addr = inet_addr( NE_IP ); sock_addr.sin_port= htons( NE_PORT );
if(connect(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) == SOCKET_ERROR) {
perror("connect()"); closesocket(sock); WSACleanup();
return;
}
memset(s_buff, 0, 8); memset(r_buff, 0, 8);
{
unsigned char d_id = 0x02; unsigned char d_rw = 0x06; unsigned short d_addr = 6; unsigned short d_value = 0x0001; unsigned short crc16;
s_buff[0] = d_id; s_buff[1] = d_rw; d_addr = ReverseByteOrder( d_addr ); memcpy(&s_buff[2], &d_addr, 2); d_value = ReverseByteOrder( d_value ); memcpy(&s_buff[4], &d_value, 2); crc16 = CreateCRC16(s_buff, 6); memcpy(&s_buff[6], &crc16, 2);
}
PrintHexa(s_buff, 8); if(send(sock, s_buff, 8, 0) == SOCKET_ERROR) { perror("send()"); closesocket(sock); WSACleanup(); return; }
if(recv(sock, r_buff, 8, 0) == SOCKET_ERROR) { perror("recv()"); closesocket(sock); WSACleanup(); return; }
PrintHexa(r_buff, 8); if(memcmp(s_buff, r_buff, 8) == 0) printf("done\n"); else printf("fail\n");
closesocket(sock); WSACleanup();
system("pause"); }
unsigned short ReverseByteOrder(unsigned short value) { unsigned short ret = 0; ((char*)&ret)[0] = ((char*)&value)[1]; ((char*)&ret)[1] = ((char*)&value)[0]; return ret; }
unsigned short CreateCRC16(char *buff, size_t len) { unsigned short crc16 = 0xFFFF; int i = 0; unsigned char* c_buff = (unsigned char*)buff;
while(len--) { crc16 ^= *c_buff++;
for(i=0; i<8; i++) { if(crc16&1) { crc16 >>= 1; crc16 ^= 0xA001; } else { crc16 >>= 1; } } } return crc16; }
void PrintHexa(char* buff, size_t len) { size_t i; for(i = 0; i < len; i++) { printf("%02X ", (unsigned char)buff[i]); } printf("\n"); }
[사용법]
1. TCP/IP SERVER <-> TCP/IP CLIENT
1) 서버를 먼저 실행한다.
2) 클라이언트를 실행한다.
3) 수행 결과를 확인한다.
2. MODBUS TCP SERVER <-> MODBUS TCP 각종 기능들
1) 서버를 먼저 실행한다.
2) 각종 기능들을 실행한다.
3) 수행 결과를 확인한다.