Linux socket编程

1、Linux/Unix Socket 函数库
    Linux Socket 函数库是从Berkeley大学开发的BSD Linux系统中移植过来的。BSD Socket 接口在众多Unix系统中
被广泛支持的TCP/IP通信接口,Linux下的Socket程序设计也适用于大多数其他的Unix系统。

 

2、Socket编程原理
     套接口网络编程原理
     套接口有三种类型:流式套接口、数据报套接口以及原始套接口。
     流式套接口定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。
数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且
不保证可靠,无差错。原始接口允许对底层协议如IP或者ICMP直接访问,主要用于新的网络协
议实现测试等。
      无连接服务器一般都是面向事物处理,一个请求与一个应答就完成了客户程序与服务程
序之间的相互作用。使用无连接的套接口编程,程序的流程可以用如下表示。

面向连接的服务器处理请求比较复杂,使用面向连接的套接口编程,流程如下表示

          

       套接口工作过程如下:启动服务器,通过调用socket()建立一个套接口,然后调用
bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听准备,并规定
他的请求对垒的长度,之后就调用accept()来接收连接。客户在建立套接口后就可以调用connect()
和服务器建立连接。连接一旦建立,客户端和服务器之间就可以通过read()和write()来发送和
接收数据。最后,带数据传送结束后,双方调用close()关闭套接口。

 

3、客户端例程

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>

#define PORT 12345
#define HOST_ADDR "192.168.47.187"

void main()
{
    struct sockaddr_in server;
    int s, ns;
    int pktlen, buflen;

    char buf1[256], buf2[256];
    
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = inet_addr(HOST_ADDR);

    if(connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        perror("connect()");
        return;
    }

    while(1)
    {
        printf("Input send data:");
        gets(buf1);
        buflen = strlen(buf1);
        if(buflen == 0)
        {
            break;
        }
        send(s, buf1, buflen+1, 0);
    }

    close(s);
}

4、服务端例程

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>

#define PORT     12345

void main()
{
    struct sockaddr_in client, server;
    int s, ns, namelen, pktlen;
    char buf[256];

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = INADDR_ANY;
    bind(s, (struct sockaddr *)&server, sizeof(server));
    listen(s, 1);
    namelen = sizeof(client);
    ns = accept(s, (struct sockaddr *)&client, &namelen);

    while(1)
    {
        pktlen = read(ns, buf, sizeof(buf), 0);
        if(pktlen == 0)
            break;
        printf("Receive tcp data: %s \n", buf);
        write(ns, buf, pktlen, 0);
        memset(buf, 0, sizeof(buf));
    }
    printf("close tcp link %d\n", ns);
    close(ns);
    close(s);
}

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值