client.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <pthread.h>
#include <sys/types.h>
#include <stdarg.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <signal.h>
void myprint(char* fmt, ...)
{
char szPrintBuff[128] = {0};
int iTmp = 0;
va_list args;
time_t now = time(NULL);
struct tm * ltm = localtime(&now);
iTmp = sprintf(szPrintBuff, "[%04d-%02d-%02d %02d:%02d:%02d]", ltm->tm_year + 1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec);
va_start(args, fmt);
vsprintf(szPrintBuff + iTmp, fmt, args);
va_end(args);
fprintf(stdout,"%s", szPrintBuff);
}
#if 0
/*这个结构用来存储套接字地址*/
struct sockaddr
{
unsigned short sa_family; /* address族, AF_xxx ,一般都是AFINET*/
char sa_data[14]; /* 14 bytes的协议地址 包含了一些远程电脑的地址、端口和套接字的数目,
里面的数据是杂的,所以有了sockaddr_in*/
};
/*为了处理 struct sockaddr, 程序员建立了另外一个相似的大小相同的结构 struct sockaddr_in;
struct sockaddr_in (“in” 代表 “Internet”)*/
struct sockaddr_in
{
short int sin_family; /* Internet地址族 */
unsigned short int sin_port; /* 端口号 网络字节序 htons(),htonl(),ntohs(),ntohl()*/
struct in_addr sin_addr; /* Internet地址 网络字节序 inet_ntoa(sin_addr)*/
unsigned char sin_zero[8]; /* 添0(和struct sockaddr一样大小)*/
};
struct in_addr
{
unsigned long s_addr;/*inet_addr("166.111.69.52")*/
};
/*注意:inet_ntoa() 返回一个字符指针,它指向一个定义在函数 inet_ntoa() 中的 static 类型字符串。所
以每次你调用 inet_ntoa(),都会改变之前调用 inet_ntoa() 函数时得到的结果。*/
#endif
#define SERVER_PORT 12345
#define MAXDATASIZE 100
#define SERVER_IP "127.0.0.1"
/*
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
*/
void handleSignal(int value)
{
switch(value)
{
case 2:
myprint("\n SIGINT : 点击了Ctrl+C 关闭\n");
break;
case 3:
myprint("\n SIGQUIT \n");
break;
case 8:
myprint("\n SIGFPE : 浮点异常\n");
break;
case 9:
myprint("\n SIGKILL \n");
break;
case 11:
myprint("\n SIGSEGV : 段错误\n");
break;
case 13:
myprint("\n SIGPIPE : 管道异常\n");
break;
case 15:
myprint("\n SIGTERM : 被另一个进程关闭\n");
break;
default:
myprint("\n Unknow type %d \n", value);
}
}
int main(int argc, char *argv[])
{
int sockfd = -1;
int recvbytesnum =