Blame |
Last modification |
View Log
| RSS feed
#include "SiTCP.h"
//------------------------------------------------------------------------------------------------------
void SiTCPinit
(){
printf("SiTCP control --> Start.\n");
WORD wVersionRequested
;
WSADATA wsaData
;
int err
;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested
= MAKEWORD
(2, 2);
err
= WSAStartup
(wVersionRequested
, &wsaData
);
if (err
!= 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err
);
}
};
//------------------------------------------------------------------------------------------------------
void SiTCPclose
(){
WSACleanup
();
printf("SiTCPclose -> Done.\n");
};
//------------------------------------------------------------------------------------------------------
int SiTCPSetIPPort
(char* IpAddr
, unsigned int tcp
, unsigned int udp
){
sitcpIpAddr
= IpAddr
;
if(tcp
<=0 || 65535<=tcp
|| udp
<=0 || 65535<=udp
){
if(tcp
<=0 || 65535<=tcp
){
printf("error : invalid port : tcp = %u\n", tcp
);
}
if(udp
<=0 || 65535<=udp
){
printf("error : invalid port : udp = %u\n", udp
);
}
printf("exit(1);!!!\n");
}
tcpPort
= tcp
;
udpPort
= udp
;
puts("");
printf("SiTCP:IP Address = %s\n", sitcpIpAddr
);
printf(" TCP Port = %u\n", tcpPort
);
printf(" UDP Port = %u\n", udpPort
);
puts("");
return 1;
}
//------------------------------------------------------------------------------------------------------
int SiTCPCreateTCPSock
(){
printf("Create socket for TCP...");
tcpsock
= socket
(AF_INET
, SOCK_STREAM
, 0);
if(tcpsock
< 0){
perror("TCP socket");
printf("errno = %d\n", errno
);
printf("exit(1);!!!\n");
}
memset(&tcpAddr
, 0, sizeof(tcpAddr
));
tcpAddr.
sin_family = AF_INET
;
tcpAddr.
sin_port = htons
(tcpPort
);
tcpAddr.
sin_addr.
s_addr = inet_addr
(sitcpIpAddr
);
printf(" Done\n");
printf(" ->Trying to connect to %s ...\n", sitcpIpAddr
);
if(connect
(tcpsock
, (struct sockaddr
*)&tcpAddr
, sizeof(tcpAddr
)) < 0){
if(errno
!= EINPROGRESS
) perror("TCP connection");
FD_ZERO
(&rmask
);
FD_SET
(tcpsock
, &rmask
);
wmask
= rmask
;
timeout.
tv_sec = 3;
timeout.
tv_usec = 0;
int rc
= select
(tcpsock
+1, &rmask
, NULL
, NULL
, &timeout
);
if(rc
<0) perror("connect-select error");
if(rc
==0){
puts("\n =====time out !=====\n ");
printf("exit(1);!!!\n");
}
else{
puts("\n ===connection error===\n ");
printf("exit(1);!!!\n");
}
}
FD_ZERO
(&readfds
);
FD_SET
(tcpsock
, &readfds
);
FD_SET
(0, &readfds
);
puts(" ->Connect success!");
return 1;
}
//------------------------------------------------------------------------------------------------------
int SiTCPCreateUDPSock
(){
printf("Create socket for RBCP...");
udpsock
= socket
(AF_INET
, SOCK_DGRAM
, 0);
//if(udpsock < 0){
if(udpsock
== INVALID_SOCKET
){
//perror("UDP socket");
//printf("errno = %d | udpsock = %d\n", errno, udpsock);
printf("errno = %d | udpsock = %d\n", WSAGetLastError
(), udpsock
);
printf("exit(1);!!!\n");
}
memset(& SiTCPudpAddr
, 0, sizeof( SiTCPudpAddr
));
SiTCPudpAddr.
sin_family = AF_INET
;
SiTCPudpAddr.
sin_port = htons
(udpPort
);
SiTCPudpAddr.
sin_addr.
s_addr = inet_addr
(sitcpIpAddr
);
printf(" Done\n");
return 1;
}
//------------------------------------------------------------------------------------------------------
int SiTCPCloseUDPSock
(){
printf("Close UDP Socket...");
closesocket
(udpsock
);
printf(" Done\n");
return 1;
}
//------------------------------------------------------------------------------------------------------
int SiTCPCloseTCPSock
(){
printf("Close TCP Socket...");
closesocket
(tcpsock
);
printf(" Done\n");
return 1;
}
//------------------------------------------------------------------------------------------------------
void SiTCPRBCPskeleton
(unsigned char type
, unsigned char command
, unsigned char id
,
unsigned char length
, unsigned int address
){
SiTCPsndHeader.
type=type
;
SiTCPsndHeader.
command=command
;
SiTCPsndHeader.
id=id
;
SiTCPsndHeader.
length=length
;
SiTCPsndHeader.
address=htonl
(address
);
memcpy(SiTCPsndBuf
, &SiTCPsndHeader
, sizeof(SiTCPsndHeader
));
}
//------------------------------------------------------------------------------------------------------
int SiTCPrcvRBCP_ACK
(int output
){
//printf("hogeeeee0");
fd_set setSelect
;
int rcvdBytes
;
unsigned char rcvdBuf
[1024];
int rd_data
;
// puts("\nWait to receive the ACK packet...");
int recvVal
= 1;
while(recvVal
){
//printf("hogeeeee1");
FD_ZERO
(&setSelect
);
//printf("hogeeeee2");
FD_SET
(udpsock
, &setSelect
);
//printf("hogeeeee3");
timeout.
tv_sec = 3;
timeout.
tv_usec = 0;
//printf("hogeeeee4");
if(select
(udpsock
+1, &setSelect
, NULL
, NULL
,&timeout
)==0){
// time out
//printf("hogeeeee5");
recvVal
= 0;
puts("\n***** Timeout ! *****");
//printf("hogeeeee6");
return -1;
}
else {
// receive packet
//printf("hogeeeee7");
if(FD_ISSET
(udpsock
,&setSelect
)){
//printf("hogeeeee8");
//rcvdBytes=recvfrom(udpsock, rcvdBuf, 2048, 0, NULL, NULL);
rcvdBytes
=recvfrom
(udpsock
, rcvdBuf
, 1024, 0, NULL
, NULL
);
if(rcvdBytes
< 0) {
Sleep
(1000);
rcvdBytes
=recvfrom
(udpsock
, rcvdBuf
, 1024, 0, NULL
, NULL
);
}
//printf("hogeeee88");
rcvdBuf
[rcvdBytes
]=0;
if(output
== 1){
//puts("\n***** A pacekt is received ! *****.");
//puts("Received data:");
//printf("hogeeeee9");
int j
=0;
for(int i
=0; i
<rcvdBytes
; i
++){
if(j
==0) {
//printf("hogeeeee10");
//printf("\t[%.3x]:%.2x ",i,rcvdBuf[i]);
j
++;
}else if(j
==3){
//printf("hogeeeee11");
//printf("%.2x \n",rcvdBuf[i]);
j
=0;
}else{
//printf("hogeeeee12");
//printf("%.2x ",rcvdBuf[i]);
j
++;
}
}
//puts("\n");
rd_data
= rcvdBuf
[8];
}
recvVal
= 0;
}
}
}
// printf("%.2x",rd_data);
return rd_data
;
//usleep(50);
}
//------------------------------------------------------------------------------------------------------
int SiTCPGetTCPSock
(){return tcpsock
;}
int SiTCPGetUDPSock
(){return udpsock
;}
struct bcp_header SiTCPGetSiTCPsndHeader
() {return SiTCPsndHeader
;}