Socket初体验1

    网络编程之前看过一些,今天下午闲来无事,写了几个简单的socket套接字程序来try一下,体验一下网络编程的乐趣.^_^

    在网络高速发展的今天,我觉得作为一个IT人,网络编程因该是有点小了解的,PS,我也是刚开始看哈。。。。。

    Socket编程的是实现网络上主机之间通信的一种方式,其实实现起来还是挺简单的。写了一小段代码,如下:

---------------------------------------------------------Server.c------------------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>

int main()
{
    int server_sockfd,client_sockfd;
    int server_len,client_len;
    struct sockaddr_un server_address;
    struct sockaddr_un client_address;

    /*Delete the exitence socket,then recreate a new socket*/
    unlink("server_socket");
    server_sockfd = socket(AF_UNIX,SOCK_STREAM,0);

    /*Name the socket*/
    server_address.sun_family=AF_UNIX;
    strcpy(server_address.sun_path,"server_socket");
    server_len=sizeof(server_address);
    bind(server_sockfd,(struct sockaddr *)&server_address,server_len);

    /*create a socket link list*/
    listen(server_sockfd,5);
    while(1)
    {
        char ch;
        printf("server waiting\n");

        /*accept a socket link*/
        client_len=sizeof(client_address);
        client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);

        /*exchange data*/
        read(client_sockfd,&ch,1);
        ch++;
        write(client_sockfd,&ch,1);
        close(client_sockfd);
    }
}

--------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------Client.c--------------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>

int  main()
{
    int sockfd;
    int len;
    struct sockaddr_un address;
    int result;
    char ch='A';

    /*create a socket for client*/
    sockfd = socket(AF_UNIX,SOCK_STREAM,0);

    /*Name the socket depend on the server*/
    address.sun_family = AF_UNIX;
    strcpy(address.sun_path,"server_socket");
    len = sizeof(address);

    /*link our socket to the server socket*/
    result = connect(sockfd,(struct sockaddr *)&address,len);

    if(result == -1)
    {
        perror("oops:client1");
        exit(1);
    }


    /*Send data*/
    printf("Send Char:");
    scanf("%c",&ch);

    write(sockfd,&ch,1);
    read(sockfd,&ch,1);
    printf("Char from server = %c \n",ch);
    close(sockfd);
    exit(0);
}

------------------------------------------------------------------------------------------------------------------------------------------------


源代码编译完成生成对应的client和server可执行目标文件,然后在两个窗口分别运行即可。也可以设置服务端后台运行./server &

运行后客户端发起一个套接字连接请求,服务端的监听程序监听到申请后建立一个和客户端的套接字连接,之间可以开始传输信息。

通过这部分,对socket了解比较深入,套接字有几个比较重要的属性,这是编程中的关键地方:套接字的域,套接字的类型,套接字协议。

1.套接字的域:指套接字通讯中使用的网络介质,最长见的是AF_UNIX和AF_INET前者本地文件类型的套接字传输类型,后者为internet网络传输类型,整个套接字的地址类型其实和文件操作非常的相似,实际上套接字的实现我们可以理解为分布式的文件操作,本程序运行时我们可以看到在当前目录下存在一个server_socket文件,通过file socket_server 命令我们可以看到这是一个socket套接字文件。深意大家可以仔细阅读一下相关方面的书籍。

2.套接字的类型:分为Stream和Datagram两种类型,前者是流套接字,后者是数据报套接字,stream提供一个可靠的,有序的,双向的字节流连接--TCP。datagram提供的是一个不建立连接的数据传输,UDP,但是效率和速度也快。

3.套接字协议:默认是0,具体更改的话可以参考函数的参数类型,man是一个很有帮助的东西!!


----------------------------------------------------->

在套接字程序中另一个需要注意的地方就是套接字“地址格式”,不同的套接字可能地址的长度不一,这在连接的时候会存在一定的麻烦,所以我们需要进行一定的处理,保持地址的有效可用,Linux规定地址为最大108个字符,不同的系统可能规定不一。当地址长度超过这个最大值后会自动截断。

套接字创建后会调用一个绑定函数 bind(server_sockfd,(struct sockaddr *)&server_address,server_len);,把对应的地址分配给关联的未命名的套接字,地址长度由事先求出的值制定。

服务端开启一个监听队列,listen(int socket,int Max_num);这个队列设定了可以最大相应的套接字请求数目,超过最大响应数目后服务器将忽略连接请求。

服务端通过client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);来接受连接请求,并且建立通信连接。

客户端通过 result = connect(sockfd,(struct sockaddr *)&address,len);发起连接。

上述的几种函数都可能存在无法响应的情况,错误码会存储在errno中,可以判断从而更好设计我们的程序,来保持程序的健壮行和提示的友好性。

好了,其实内容还有很多,想写的太多,后续跟进吧!!!Go on.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值