- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include "fcntl.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()
- {
- }
- //该片段来自于http://www.codesnippet.cn/detail/2710201513918.html
来源: http://www.codesnippet.cn/detail/2710201513918.html