设为首页 加入收藏

TOP

c指针(28):LINUX应用(4)(一)
2014-03-10 13:04:24 来源: 作者: 【 】 浏览:237
Tags:指针 LINUX 应用

    一、端口
    1、0-1023:预留端口,超级用户使用
    2、1024-49151:已经注册的端口号
    3、49152-65535:可自由使用的端口或动态端口
    二、套接字类型
    1、SOCK_STREAM(字节流套接字):面向连接,可靠的全双工字节流。对于AF_INET来说,建立TCP连接
    2、SOCK_DGRAM(数据报套接字):不保证数据正确分发,不保证发送数据的训序。对于AF_INET来说,建立UDP连接
    3、SOCK_RAW(原始套接字)
    三、建立套接字
    int fd;
    fd=socket(AF_INET,SOCK_STREAM,0);//除使用SOCK_RAW外,最后一个protocol被设置为0,AF_INET为套接口
    四、应用
    1.server
    deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcps
    server wait…
    ……
    server read :myhaspl
    server send :hello
    ……
    server read :myhaspl
    server send :hello
    2.client
    deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcpc
    client send…
    client send :myhaspl
    client read :hello
    deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcpc
    client send…
    client send :myhaspl
    client read :hello
    deepfuture@deepfuture-laptop:~/private/mytest$
    3.source
    1)server
    C代码
    #include <stdio.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    //myhaspl
    ssize_t readn(int fd,void *ptr,size_t maxcn){//读取n个字符,maxc为读取的数目
    size_t noreadcn,readcn;
    char *buf=ptr;
    noreadcn=maxcn;
    while(noreadcn>0){
    if ( (readcn=read(fd,buf,noreadcn))<0){//读数据
    if (errno==EINTR) {//数据读取前,操作被信号中断
    perror("中断错误");
    readcn=0;
    }
    else {return -1;}//无法修复错误,返回读取失败
    }
    else if(readcn==0) break;//EOF
    noreadcn-=readcn;//读取成功,但是如果读取的字符数小于maxc,则继续读,因为可能数据还会继续通过网络送过来
    buf+=readcn;
    if (*buf==0) break;//如果读到字符串结尾标志则退出,必须有这句,否则会死循环
    }
    return (maxcn-noreadcn);
    }
    ssize_t  writen(int fd,void *ptr,size_t maxcn){//写入n个字符
    size_t nowritecn,writecn;
    char *buf=ptr;
    nowritecn=maxcn;
    while(nowritecn>0){
    if((writecn=write(fd,buf,nowritecn))<=0){//写数据
    if (errno==EINTR) {//数据写前,操作被信号中断
    perror("中断错误");
    writecn=0;
    }
    else {return -1;}//无法修复错误,返回读取失败
    }
    nowritecn-=writecn;
    buf+=writecn;
    }
    return (maxcn-nowritecn);
    }
    int main(void){
    int fd;
    int addresslen;
    struct sockaddr_in address;//地址信息结构
    int pid;
    int rc;
    fd_set fdset;
    //建立socket
    fd=socket(AF_INET,SOCK_STREAM,0);//fd为socket
    if (fd==-1){//错误,类型从errno获得
    perror("error");//perror先输出参数,后跟":"加空格,然后是errno值对应的错误信息(不是错误代码),最后是一个换行符。
    }
    //bind 到socket fd
    address.sin_family=AF_INET;//IPV4协议,AF_INET6是IPV6
    address.sin_addr.s_addr=htonl(INADDR_ANY);//l表示32位,htonl能保证在不同CPU的相同字节序
    address.sin_port=htons(1253);//端口号,s表示16位
    addresslen=sizeof(address);
    bind(fd,(struct sockaddr *)&address,addresslen);//bind
    //建立socket队列,指定最大可接受连接数
    rc=listen(fd,32);//最多接收32个连接,开始监听
    //int listen(int sockfd, int backlog)返回:0──成功, -1──失败
    //内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c指针(29):C应用技巧 下一篇c语言迷宫最短路径

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: