#include<stdio.h> #include<stdlib.h> #include<string.h> #include"fcntl.h" #include"sys/types.h" #include"sys/stat.h" #include <sys/types.h> /* basic system data types */ #include <sys/socket.h> /* basic socket definitions */ #include <sys/time.h> /* timeval{} for select() */ #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ #include <arpa/inet.h> /* inet(3) functions */ #include <errno.h> #include <netdb.h> #include <sys/time.h> #include <limits.h> #include <net/if_arp.h> #include <net/if.h> #include <netinet/tcp.h> #include <limits.h> #define BACKLOG 10 int server_start(int port) { struct hostent *host; struct sockaddr_in serv_addr; int sockfd; /* 获取ip地址信息 */ /* if((host=gethostbyname(server))==NULL){ errorlogs("gethostbyname"); return -1; }*/ serv_addr.sin_family=AF_INET;//地址族
serv_addr.sin_port=htons(port);//端口号
serv_addr.sin_addr.s_addr=INADDR_ANY;//表示机器上的所用网络地址
bzero(&(serv_addr.sin_zero),8);//填充0,保证与struct sockaddr同样大小
/* 建立socket连接 */ if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ errorlogs("socket server start"); return -1; } logs("socket create success"); //设置sockets发送/接受缓存大小
/* must setting it before listen or accept */ /* int buffsize = 81960; //default value is 8196 setsockopt(sockfd ,SOL_SOCKET,SO_SNDBUF,(char *)&buffsize,sizeof(buffsize)); setsockopt(sockfd ,SOL_SOCKET,SO_RCVBUF,(char *)&buffsize,sizeof(buffsize)); */ /* 与网卡地址绑定 */ if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){ errorlogs("bind"); return -1; } logs("bind success"); /* 侦听连接 */ if(listen(sockfd,BACKLOG)==-1){ errorlogs("listen"); return -1; } logs("listening . . ."); return sockfd; } int get_connect(int sockfd) { fd_set readfd; struct sockaddr_in client_sockaddr; /* 初始化文件描述符集 */ //FD_ZERO(&readfd);
//FD_SET(sockfd,&readfd);
int sin_size; int client_fd; sin_size=sizeof(struct sockaddr_in); while(1){ /* 调用select函数,一直等待,直到有连接到达 */ // if(select(sockfd+1,&readfd,NULL,NULL,(struct timeval *)0)>0){
/* 描述符集有变化,有新的连接 */ // if(FD_ISSET(sockfd,&readfd)>0){
/* 接受连接 */ if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){ errorlogs("accept"); return -1; } return client_fd; }/*while*/ } int server_connect(char *server,int port) { struct hostent *host; struct sockaddr_in serv_addr; int sockfd; /* 获取ip地址信息 */ printf("%s:%d\n",server,port); if((host=gethostbyname(server))==NULL){ errorlogs("gethostbyname"); return -1; } serv_addr.sin_family=AF_INET;//地址族
serv_addr.sin_port=htons(port);//端口号
serv_addr.sin_addr=*((struct in_addr *)host->h_addr);//IP地址,host->h_addr返回h_addr_list中的第一地址
bzero(&(serv_addr.sin_zero),8);//填充0,保证与struct sockaddr同样大小
/* 建立socket连接 */ if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ errorlogs("socket create"); return -1; } logs("socket create success"); /* int buffsize = 81960; //default value is 8196 setsockopt(sockfd ,SOL_SOCKET,SO_SNDBUF,(char *)&buffsize,sizeof(buffsize)); setsockopt(sockfd ,SOL_SOCKET,SO_RCVBUF,(char *)&buffsize,sizeof(buffsize)); */ /* 尝试连接远程服务器 */ if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){ errorlogs("connect"); close(sockfd); return -1; } return sockfd; } int data_recv_length_timeout(int sockfd,char *data,int length,int sec) { int recvbytes,wait_length; int total=0,ret; fd_set rdfds; struct timeval tv; FD_ZERO(&rdfds); FD_SET(sockfd, &rdfds); tv.tv_sec = sec; tv.tv_usec = 0; if(length==0) wait_length=USHRT_MAX; else wait_length=length; while(total<wait_length) { ret = select(sockfd + 1, &rdfds, NULL, NULL, &tv); if(ret < 0) { errorlogs("data_recv_length select error:"); return -1; }else if(ret==0) { logs("data_recv_length select timeout"); return 0; }else{ if(FD_ISSET(sockfd, &rdfds)) { if((recvbytes=recv(sockfd,data+total,wait_length-total,MSG_NOSIGNAL))==-1) { errorlogs("ENGAIN recv"); return -1; }else if(recvbytes==0){ logs("remote close the connect"); return -1; } if(length==0) return recvbytes; total+=recvbytes; printf("total:%d\n",total); } } } /* if(DEBUG){ char s[30]; logs("***********************************\n"); sprintf(s,"Recv %d BYTE data\n",recvbytes); logs(s); logs("***********************************\n"); }*/ return total; } //int data_send_timeout(int sockfd,char *data,int length,int sec)
int data_send_timeout(int sockfd,char *data,int length,int sec) { int sendbytes; int total=0; fd_set rdfds; struct timeval tv; FD_ZERO(&rdfds); FD_SET(sockfd, &rdfds); tv.tv_sec = sec; tv.tv_usec = 0; int ret; /* 发送数据直至完成 */ while(total<length){ /* 若操作系统一次没有发完,根据实际发送的字节数,发送剩余的 */ logs("wait select ..............."); ret = select(sockfd + 1, NULL, &rdfds, NULL, &tv); if(ret < 0) { errorlogs("data_send select error:"); return -1; }else if(ret==0) { logs("data_send select timeout"); return -1; }else{ if(FD_ISSET(sockfd, &rdfds)){ if((sendbytes=send(sockfd,data+total,length-total,MSG_NOSIGNAL))==-1){ errorlogs("send"); return -1; } total+=sendbytes; logs("size %d data already send!",sendbytes); }else { logs("send function not run"); } } } return total; } int main() { }
|