linux环境下的网络编程(C语言)

前言:

这里给出一个简单的socket网络编程实例,使用tcp协议进行通信。

服务端:进行监听,连接成功后,收到客户端的信息,打印出信息内容,并给客户端发送回应。

客户端:连接成功后,给服务端发送信息,并接收服务端的回应,打印出回应内容。


程序:

服务端
文件名:server.c
#include
#include
#include
#include
#include
#include
int main()
{
        char buffread[1024]={0};
        char buffwrite[1024]="get success";
        int server_fd,client_fd;
        int server_len,client_len;
        struct sockaddr_in server_address;
        struct sockaddr_in client_address;
        int i;

        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1)
        {
                return -1;
        }
        server_address.sin_family=AF_INET;
        server_address.sin_addr.s_addr=htonl(INADDR_ANY);
        server_address.sin_port=htons(1234);//服务端和客户端的端口号要一致

        i=bind(server_fd,(struct sockaddr*)&server_address,sizeof(server_address));
        if(i==-1)
        {
                return -1;
        }
        i=listen(server_fd,5);
        if(i==-1)
        {
                return -1;
        }

        client_fd=accept(server_fd,(struct sockaddr*)&client_address,(socklen_t *__restrict)&client_len);
        if(client_fd==-1)
        {
                return -1;
        }

        recv(client_fd,buffread,1024,0);
        printf("the message:%s\n",buffread);
        send(client_fd,buffwrite,sizeof(buffwrite),0);

        close(server_fd);
        close(client_fd);
        return 0;
}


客户端:
文件名:client.c
#include
#include
#include
#include
#include


int main()
{
        int rslt=0;
        rslt = socket(AF_INET, SOCK_STREAM, 0);
        if(rslt == -1){
                return -1;
        }

        struct sockaddr_in serAddr;
        serAddr.sin_family = AF_INET;
        serAddr.sin_addr.s_addr = inet_addr("10.20.88.189");
        serAddr.sin_port = htons(1234);  //服务端和客户端的端口要一致

        int i = -1;
        i = connect(rslt, (struct sockaddr*)&serAddr, sizeof(struct sockaddr_in)) ;
        if( i == -1){
                return -1;
        }

        char buffsend[1024]="hello";
        i = send(rslt, buffsend, 1024, 0);
        if(i<=0)
        {
                return -1;
        }

        char buffrecv[1024]={0};
        i = recv(rslt, buffrecv, 1024, 0);
        if(i <= 0){
                return -1;
        }

        printf("the server response:%s\n",buffrecv);
        close(rslt);
        return 0;
}

对以上程序进行解析:

#include  
int socket(int family, int type, int protocol);   //指定期望的通信协议类型,返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd  

family:协议族
AF_INET IPv4协议 
AF_INET6 IPv6
AF_LOCAL Unix域协议(15章)
AF_ROUTE  路由套接字(18章)
AF_KEY 密钥套接字(19章)

type:套接字的类型
SOCK_STREAM(常用) 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_SEQPACKET  有序分组套接字
SOCK_RAW 原始套接字

protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议


int send(SOCKET s, const char FAR *buf, int len, int flags);  
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。


int recv(SOCKET s, char FAR *buf, int len, int flags);  
不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。

完!!



你可能感兴趣的:(网络协议与编程,linux,C高级编程)