socket通信之 tcp协议1

步骤:
        1. 创建套件字          
            fd1 = socket(AF_INET, SOCK_STREAM, 0);
             参数1:通信域   
                         AF_UNIX/AF_LOCAL: 本机通信
                         AF_INET :跨机器通信--用的协议族ipv4
             参数2:传输什么类型是数据
                          SOCK_STREAM: 传输是字节流---tcp
                          SOCK_DGRAM :传输的是数据报-- udp
                          SOCK_RAW : 传输的是内部协议--icmp


        2. 绑定 : 端口号和ip地址(当前主机)进行绑定,让别人链接
            int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

             参数1:当前的创建的socket
             参数2:地址和端口的信息和 self.sin_family = AF_INET;
             参数3:地址和信息的长度

        3. 设置监听 : 
            int listen(int sockfd, int backlog);

            参数2:最大的客户端的个数, 5-10

       4. 等待客户端的连接
           int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

           参数1: 服务端的创建的socket对应的fd
           参数2,3表示客户端的信息,当然也可以不关心对方是谁,就可以填NULL, NULL

           返回值:返回一个新的文件描述符,和客户端进行数据通信的
服务端
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/in.h>


#define SRV_PORT 9999


int main(int argc, char *argv[])
{

    // create a socket
    int srv_fd;
    int ret;
    char buf[128];

    srv_fd = socket(AF_INET, SOCK_STREAM, 0);   //创建套接字
    if(srv_fd < 0)
    {
    perror("socket");
    exit(1);
    }

    // bind addr
    struct sockaddr_in  self;
    self.sin_family = AF_INET;
    self.sin_port = htons(SRV_PORT);
    //self.sin_addr.s_addr = inet_addr("192.168.7.5");                  //本机器的ip
    self.sin_addr.s_addr = htonl(INADDR_ANY);                           //本机器的所有ip
    ret = bind(srv_fd, (const struct sockaddr *)&self, sizeof(self));   //绑定本机ip
    if(ret < 0)
    {
    perror("bind");
    exit(1);
    }


    // listen
    listen(srv_fd, 6);              //设置监听

    // accept
    int new_fd;
    printf("--------^_^ I'am waing.......\n");

    //new_fd =  accept(srv_fd, NULL, NULL);
    struct sockaddr_in client_addr;
    socklen_t  len = sizeof(client_addr);
    new_fd = accept(srv_fd,  (struct sockaddr *)&client_addr,  &len);  //等待客户端的连接
    if(new_fd < 0)
    {
    perror("accept");
    exit(1);
    }

    printf("we got a new client\n");
    printf("client ip : %s, port : %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    while(1)
    {

    ret = read(new_fd, buf, 128);                     //通信
    if(ret < 0)
    {
        perror("read");
        exit(1);
    }
    if(ret == 0)
    {
        printf("client disconnect\n");
        break;
    }
    buf[ret] = '\0';
    printf("from client : %s\n", buf);

    }


    close(srv_fd);
    close(new_fd);

    return 0;

}
客户端


#include <stdio.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/in.h>


#define SRV_PORT 9999
#define SRV_IP  "192.168.7.5"

int main(int argc, char *argv[])
{

    // create socket
    int ret;
    int count = 5;
    char *content = "hello server, come on baby";

    if(argc < 2)
    {
    printf("usage :  ./client  serverip\n");
    exit(1);
    }


    int fd = socket(AF_INET, SOCK_STREAM, 0);   //创建套接字
    if(fd < 0)
    {
    perror("socket");
    exit(1);
    }

    // connect
    struct sockaddr_in peer;
    peer.sin_family = AF_INET;
    peer.sin_port = htons(SRV_PORT);
    //inet_aton(SRV_IP, &peer.sin_addr);    
    inet_aton(argv[1], &peer.sin_addr);    

    ret = connect(fd, (struct sockaddr *)&peer, sizeof(peer));   //链接服务端
    if(ret < 0)
    {
    perror("connect");
    exit(1);
    }    

    while(count--)
    {
    ret = write(fd, content, strlen(content));              //通信
    if(ret < 0)
    {
        perror("write");
        exit(1);
    }
    sleep(1);    
    } 


    close(fd);

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值