#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#define isNum(A) (((A) >= '0' && (A) <= '9'))
#define isAtoF(A) (((A) >= 'A' && (A) <= 'F'))
#define isatof(A) (((A) >= 'a' && (A) <= 'f'))
#define ETH_BUFF_SIZE 100
#define SERV_PORT 8008
#define BACKLOG 20
/*********************************************************************
文字列转数值
*********************************************************************/
boolean char_to_num(const char* str, int radix, int* num)
{
boolean sign = TRUE, result = FALSE, validNum = FALSE;
int slen = strlen(str);
int cnt;
*num = 0;
for (cnt = 0; cnt < slen; cnt++) {
if (isNum(str[cnt])) { /* 0-9 */
*num *= radix;
*num += (str[cnt] - '0');
validNum = TRUE;
} else if ((radix == 16) && (isAtoF(str[cnt]))) { /* A-F */
*num *= radix;
*num += (str[cnt] - 'A' + 0xa);
validNum = TRUE;
} else if ((radix == 16) && (isatof(str[cnt]))) { /* a-f */
*num *= radix;
*num += (str[cnt] - 'a' + 0xa);
validNum = TRUE;
} else { /* 数值以外 */
if (str[cnt] == '-' && (cnt == 0)) { /* 负数 */
sign = FALSE;
} else {
break;
}
}
}
if (sign == FALSE) {
*num = -1 * *num;
}
if (validNum) {
result = TRUE;
}
return result;
}
/*********************************************************************
main task
*********************************************************************/
int main(int argc, char* argv[])
{
int ret;
int sockfd;
int clientfd;
struct sockaddr_in host_addr;
struct sockaddr_in client_addr;
int length = sizeof(client_addr);
const char reuse = 1;
int numbytes;
char buff[ETH_BUFF_SIZE];
WSADATA wsaData;
FILE* fp = NULL;
char Path[128];
char filename[128];
char full_path[255];
time_t nowtime;
struct tm *cur_time;
printf("net server port:%d\n", SERV_PORT);
GetModuleFileName(NULL, Path, 255);
(strrchr(Path, '\\'))[1] = 0;
nowtime = time(NULL);
cur_time = localtime(&nowtime);
sprintf(filename, "eth1_log_%04d-%02d-%02d %02d-%02d.txt",
(1900 + cur_time->tm_year), (1 + cur_time->tm_mon),
cur_time->tm_mday, cur_time->tm_hour, cur_time->tm_min);
sprintf(full_path, "%s%s", Path, filename);
remove(full_path);
ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0) {
printf("WSAStartup Error\n");
return -1;
}
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion)) {
WSACleanup();
printf("WSADATA version is not correct\n");
return -1;
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("server Socket Create Error\n");
return (0);
}
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
memset(&host_addr, 0x00, sizeof(host_addr));
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons(SERV_PORT);
host_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(sockfd, (struct sockaddr*)&host_addr, sizeof(host_addr));
if (ret < 0) {
printf("server bind Error\n");
close(sockfd);
return (0);
}
ret = listen(sockfd, BACKLOG);
if (ret < 0) {
printf("server listen Error\n");
close(sockfd);
return (0);
}
while (1) {
clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &length);
if (clientfd < 0) {
printf("server accept Error\n");
continue;
}
fp = fopen(full_path, "a");
while (1) {
memset(buff, 0x00, sizeof(buff));
numbytes = recv(clientfd, buff, ETH_BUFF_SIZE, 0);
if (numbytes <= 0) {
close(clientfd);
break;
} else {
printf("%s\n", buff);
fputs(buff, fp);
fputs("\n", fp);
}
}
fclose(fp);
}
close(sockfd);
return (0);
}