/*****************************************************************************
* *
* ipT.h *
* *
*****************************************************************************/
#include <stdio.h>
#define A_CLASS 0xff000000
#define B_CLASS 0xffff0000
#define C_CLASS 0xffffff00
#define IF_T(A,B,C,D) { if (A==B) {printf(C,D); exit(1);}}
#define IF_N(A,B,C,D) { if (A!=B) {printf(C,D); exit(1);}}
#define IF_T_F(A,B,C,D) { if (A==B) {printf(C,D); return -1;}}
#define IF_N_F(A,B,C,D) { if (A!=B) {printf(C,D); return -1;}}
unsigned int pow(int i, int j)
{// return i^j
register k;
unsigned retval=1;
if (j ==0) return 1;
for (k=0; k<j; k++) retval = retval*i;
return retval;
}
unsigned int s2i(const char *src)
{ //string to integer !('.' and '\n')
register i=0;
register j=0;
unsigned int ip=0;
while (src[i] != '.' && src[i] !='\0' ) i++;
for (; j < i; j++) {
ip += (src[j] - '0') * pow(10,i-j-1);
}
return ip;
}
unsigned int ip_s2i(const char *src)
{//string ip to integer ip
unsigned int ip=0;
register int j=1;
register int i=0;
ip = s2i(src);
while (src[i] != '\0') {
if (src[i] == '.') {
ip += s2i(&src[i+1])<<(j*8) ;
j++;
}
i++;
}
return ip;
}
unsigned int ip_mask(unsigned int ip)
{//return mask
unsigned int mask=0x80000000;
if (!(ip&mask)) return A_CLASS;
else {
mask >>= 1;
if (!(ip&mask)) return B_CLASS;
else return C_CLASS;
}
}
int i2s(unsigned int I_ip, char *S_ip, int mode)
{//integer to string
unsigned char C_ip;
register int i=0;
register int j=0;
register int k=14;
int imsi=0;
for (i=3; i >= 0; i--) {
C_ip = I_ip;
imsi += C_ip << (i*8);
I_ip >>= 8;
}
I_ip = imsi;
for (i=0; i <4; i++ ) {
C_ip = I_ip;
for (j=0; j<3; j++) {
imsi = C_ip%pow(10,j+1)-C_ip%pow(10,j);
if (imsi > 5) imsi /=pow(10,j);
S_ip[k] = imsi + '0';
k--;
}
S_ip[k] = '.';
k--;
I_ip >>=8;
}
if (mode) {//print form ex) 211.55.2.0 before 211.055.002.000
for (i=0,j=0; S_ip[i]; i++,j++)
{
if (S_ip[i] =='0' && S_ip[i+1] != '.'){
if (S_ip[i-1] == '.') {
i++;
if (S_ip[i] =='0') i++;
}
}
S_ip[j] = S_ip[i];
}
S_ip[j] = '\0';
}
return 0;
}
int input_ip_check(char *data)
{
register int i=0;
unsigned int ip;
int count=0;
int eCh=0;
char ipS[16]={'\0'};
memcpy(ipS,data, strlen(data));
/*______________________________ error ckeck _____________________________________*/
IF_N_F(ipS[15], '\0', "Ip adress error [%s]\n", ipS);
IF_T_F(ipS[0], '.',"Ip adress error [%s]\n",ipS);
ip = s2i(ipS);
if (ip > 255) { printf("Ip adress over num error [%s]\n",ipS); return -1;}
while (ipS[i] != '\0') {
if (ipS[i] == '.'){
if (eCh) { // '.' between '.'
if ((i-eCh) < 2 || (i-eCh) > 4){
printf("Ip adress error1 [%s]\n",ipS);
return -1;
}
}else if (i-eCh < 1) {
printf("Ip adress error2 [%s]\n",ipS);
return -1;
}
ip = s2i(&ipS[i+1]); // max num check
if (ip > 255) { printf("Ip adress over num error [%s]\n",ipS); return -1;}
eCh=i;
count++;
}
else {
if (ipS[i] < '0' || ipS[i] >'9'){ // string individual check
printf("Ip adress error3 [%s]\n",ipS);
return -1;
}
}
i++;
}
IF_T(ipS[i--],'.',"Ip adress error4 [%s]\n",ipS);
IF_N(count,3,"Ip adress '.' error5 [%s]\n",ipS);
/*-------------------------------- error ckeck end ------------------------------*/
return 0;
}
/*****************************************************************************
* *
* net_head.h *
* *
*****************************************************************************/
#include "ipT.h"
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
struct in_addr{
unsigned long s_addr;
};
struct sockaddr_in {
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
int server_socket(char *port) //socket, bind, listen (return fd)
{
int fd;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = (unsigned short)s2i(port);
addr.sin_addr.s_addr = 0;
IF_T_F((fd = socket(PF_INET,SOCK_STREAM,0)), -1, "socket creation error\n", NULL);
IF_T_F(bind(fd, (struct sockaddr *)&addr, sizeof(addr)), -1, "Bind error\n", NULL);
IF_T_F(listen(fd, 5), -1, "Listen error\n", NULL);
return fd;
}
int client_socket(char *ip, char *port) // socket, connect (return fd)
{
int fd;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = (unsigned short)s2i(port);
addr.sin_addr.s_addr = ip_s2i(ip);
IF_T_F( (fd = socket(PF_INET,SOCK_STREAM,0)), -1, "socket creation error\n", NULL);
IF_T_F(connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)), -1, "connect error\n", NULL);
return fd;
}
첫댓글 ip 변환 부분이 바뀌었습니다.
net_head.h에서 포트 번호를 리틀모드에서 빅모드로 안바꿨습니다. 이점 주의하세염.