TCP

Tcp编程:


头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h>

函数原型:
int socket(int domain, int type, int protocol);
return: -1失败 成功 返回一个新的文件描述符
int domain:代表通信地址族,AF_INET代表IPv4
int type:代表套接字的编程方式 SOCK_STREAM代表TCP
int protocol:当选用TCP时 选择0

struct sockaddr_in;保存IPv4的IP和PORT

函数原型:
int bind(int sockfd, struct sockaddr *my_addr,socklen_t addrlen);
return: 0成功 -1失败
int sockfd:返回的套接字文件描述符
struct sockaddr *my_addr:储存的服务器IP PORT
socklen_t addrlen:第二参数的长度

函数原型:
int listen(int s,int backlog);
return:0成功 -1失败
int s:要监听的套接字
int backlog:支持多少个请求

函数原型:
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
return:-1失败 成功新的文件描述符
int s:接受连接的套接字
struct sockaddr *addr:连接的客户端的IP PORT
socklen_t *addrlen: 第二个参数的长度

 

 

 

函数原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
return: 0成功 -1失败
int sockfd: 通过哪个套接字连接
const struct sockaddr *addr: 目标服务器的IP PORT
socklen_t addrlen: 第二参数的长度

 

 

 

服务器代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>


#define N 64


int main()
{
    //创建socket套接字
    int sfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sfd)
    {
        perror("socket");
        return -1;
    }


    //设置存储IP PORT变量//PORT用来区分进程
    struct sockaddr_in sddr,cddr;
    sddr.sin_family        = AF_INET;
    sddr.sin_port        = htons(6666);//PORT用来区分进程一般来说大于5000
    sddr.sin_addr.s_addr = inet_addr("0.0.0.0");//自动分配IP//也可以自己设置
    int len = sizeof(cddr);


    //把IP PORT和套接字绑定
    if(-1 == bind(sfd,(void *)&sddr,sizeof(sddr)))
    {
        perror("bind");
        return -1;
    }

    //监听套接字
    if(-1 == listen(sfd,10))
    {
        perror("listen");
        return -1;
    }
    puts("listen...");

    //创建连接
    int nfd = accept(sfd,(void *)&cddr,&len);
    if(-1 == nfd)
    {
        perror("accept");
        return -1;
    }

    char buf[N] = {0};

    while(1)
    {
        read(nfd,buf,N);
        puts(buf);
        write(nfd,buf,N);
    }
    close(sfd);
    close(nfd);

}

补充:sddr用来保存我方网络参数,cddr用来保存对方网络参数

客户端代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>

#define N 64


int main(int argc,char *argv[])
{
    if(3 > argc)
    {
        printf("argv: %s <IP> <PORT>\n",argv[0]);
        return -1;
    }

    int cfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == cfd)
    {
        perror("socket");
        return -1;
    }

    //设置服务器的IP PORT
    struct sockaddr_in sddr;
    sddr.sin_family        = AF_INET;
    sddr.sin_port        = htons(atoi(argv[2]));
    sddr.sin_addr.s_addr= inet_addr(argv[1]);

    //连接服务器
    if(-1 == connect(cfd,(void *)&sddr,sizeof(sddr)))
    {
        perror("connect");
        return -1;
    }

    char buf[N] = {0};
    while(1)
    {
        fgets(buf,N,stdin);
        write(cfd,buf,N);
        read(cfd,buf,N);
        puts(buf);
    }
    close(cfd);
}

注意:客户端运行的时候./khd 192.168.12.xxx 6666的形式运行。

 

posted @ 2021-07-18 17:32  西北小蚂蚁  阅读(58)  评论(1编辑  收藏  举报