文档章节

linux下对socket的简单封装

被使用的文件
 被使用的文件
发布于 2015/07/07 13:16
字数 774
阅读 48
收藏 0

#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()
{
    
}

© 著作权归作者所有

被使用的文件
粉丝 5
博文 44
码字总数 100266
作品 0
兰州
私信 提问
OHSCE_V0.1.20 Alpha 发布,高可靠性的PHP通信框架

OHSCE-Open HI-REL Signal Communication Engine是一款高可靠性跨平台的PHP通信框架,Windows友好且同时支持Linux和OS X。对TCP、UDP、ICMP、RS232/485通信、简单内存通信与数据暂存,可轻松...

随风星海
2016/09/08
558
2
询问学习的方向

本人今年大四。 大一、大二学c#了,做过几个项目,其中有网站、winform都有公司在使用。熟悉领域:winform控件、ADO.NET、多线程、网络、xml、了解js、css、会使用三层架构。 大三到目前一直...

Reage-
2012/12/05
489
3
求工作一份

可以提供超过8个月的实习。如果有兴趣可以提供详细简历 个人简介 本人今年大四。 大一、大二学c#了,做过几个项目,其中有网站、winform都有公司在使用。熟悉领域:winform控件、ADO.NET、多...

Reage-
2013/02/16
245
0
java的Socket与android的LocalSocket区别

个人理解LocalSocket是对linux的socket的java封装,而Socket是java自己实现的Socket。不知道对不对?Android为什么要设计LocalSocket呢?LocalSocket一般都用在哪里?一般哪里用Socket?哪里用...

亭子happy
2012/09/24
2.7K
1
高性能网络通信框架 - HP-Socket

HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)...

伤神小怪兽
2013/03/25
0
353

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部