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

前言:

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

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

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


程序:

服务端
文件名:server.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/socket.h>
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<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<time.h>


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 <sys/socket.h> 
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语言 网络编程教程及源码 一、网络应用层编程 1、Linux网络编程01——网络协议入门 2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络编程07——广播 8、Linux网络编程08——多播 9、Linux网络编程09——TCP编程之客户端 10、Linux网络编程10——TCP编程之服务器 11、Linux网络编程11——tcp、udp迭代服务器 12、Linux网络编程12——tcp三次握手、四次挥手 13、Linux网络编程13——connect()、listen()和accept()三者之间的关系 14、Linux网络编程14——I/O复用之select详解 15、Linux网络编程15——I/O复用之poll详解 16、Linux网络编程16——I/O复用之epoll详解 17、Linux网络编程17——tcp并发服务器(多进程) 18、Linux网络编程18——tcp并发服务器(多线程) 19、Linux网络编程——tcp高效并发服务器(select实现) 20、Linux网络编程——tcp高效并发服务器(poll实现) 21、Linux网络编程——tcp高效并发服务器(epoll实现) 二、网络底层编程(黑客模式) 1、Linux网络编程1——啥叫原始套接字 2、Linux网络编程2——原始套接字编程 3、Linux网络编程3——原始套接字实例:MAC头分析 4、Linux网络编程4——原始套接字实例:MAC地址扫描器 5、Linux网络编程5——IP数据报格式详解 6、Linux网络编程6——TCP、UDP数据包格式详解 7、Linux网络编程7——原始套接字实例:发送UDP数据包 8、Linux网络编程8——libpcap详解 9、Linux网络编程9——libnet详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值