linux下基于tcp和udp通信的c语言网络编程实例

总结:

tcp-客户端

1.创建一个socket,用函数socket()

2.设置要连接的对方的IP地址和端口等属性

3.连接服务器,用函数connect()

4.收发数据,用函数send()和recv(),或者read()和write()

5.关闭网络连接

tcp-服务器

1. 创建一个socket,用函数socket()

2. 绑定IP地址、端口等信息到socket上,用函数bind()

3.设置允许的最大连接数,用函数listen()

4.接收客户端上来的连接,用函数accept()

5.收发数据,用函数send()和recv(),或者read()和write()

6.关闭网络连接

udp-服务器

1.创建一个socket,用函数socket()

2.绑定IP地址、端口等信息到socket上,用函数bind()

3.循环接收数据,用函数recvfrom()

4.关闭网络连接

udp-客户端

1.创建一个socket,用函数socket()

2.绑定IP地址、端口等信息到socket上,用函数bind()

3.设置对方的IP地址和端口等属性

4.发送数据,用函数sendto()

5.关闭网络连接

遇到的问题:本人写udp传输程序时,想做个字符转换,结果一直不对,后来打印n的值才发现fgets将键盘输入的回车符吃进去了,输入的是x个字符,实际传输的却是x+1个字符(多个\n).

解决方法:常见的字符数组问题  将recvline[n-1] 值为\n的元素赋值‘\0’,就能打印出想要的字符串了。

代码:

//tcp 客户端
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>    //inet_addr()函数

#define SERV_PORT 5000

int main(int argc,char *argv[])
{
    int sockfd, n;
    struct sockaddr_in servaddr,cliaddr;
    char sendline[1000];
    char recvline[1000];

    if(argc != 2)
    {
        printf("usage:server address!\n");
        exit(0);
    }

    sockfd = socket(AF_INET,SOCK_STREAM,0);  //生成套接字
    
    //配置网路地址
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(argv[1]);
    servaddr.sin_port = htons(SERV_PORT);

    connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));   // 建立连接

    while(fgets(sendline,1000,stdin) != NULL) 
    {
        sendto(sockfd,sendline,strlen(sendline),0,(struct sockaddr *)&servaddr,sizeof(servaddr));                   //发送信息给服务器

        n = recvfrom(sockfd,recvline,1000,0,NULL,NULL);   //接收从服务器发来的信息

        recvline[n] = '\0';

        fputs(recvline,stdout);
    }

    

    close(sockfd);

    return 0;
}
//tcp 服务器
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>

#define SERV_PORT 5000

int main()
{
    int listen_fd, conn_fd, n;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t clilen;
    char msg[1000];

    listen_fd = socket(AF_INET,SOCK_STREAM,0);

    
    //配置网络地址
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    bind(listen_fd,(struct sockaddr *)&servaddr,sizeof(servaddr));  //将网络地址绑定套接字

    listen(listen_fd,100);  //服务器监听

    while(1)
    {
        clilen = sizeof(cliaddr);

        conn_fd = accept(listen_fd,(struct sockaddr *)&cliaddr,&clilen); //每有一个客户端生成一个连接套接字

        while(1)
        {
            n = recvfrom(conn_fd,msg,1000,0,(struct sockaddr *)&cliaddr,&clilen);//接受客户端的信息

            if(n == 0)
            {
                printf("client offline!\n");
                break;
            }

            sendto(conn_fd,msg,n,0,(struct sockaddr *)&cliaddr,clilen); //向客户端发送信息

            printf("-----------------------------\n");

            msg[n] = '\0';

            printf("received the following:\n");

            printf("%s\n",msg);

            printf("------------------------------\n");
        }

        close(conn_fd);
    }
    
    close(listen_fd);

    return 0;
}

运行结果:

 

 

//udp 客户端
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>

#define SERV_PORT 5000

int main(int argc,char *argv[])
{
    int sockfd, n, servaddr_len;
    struct sockaddr_in servaddr, cliaddr;
    char sendline[1000], recvline[1000];

    if(argc != 2)
    {
        printf("Please input servaddr!\n");
        exit(0);
    }

    sockfd = socket(AF_INET,SOCK_DGRAM,0);

    bzero(&servaddr,sizeof(servaddr));

    servaddr.sin_family = AF_INET;

    servaddr.sin_addr.s_addr = inet_addr(argv[1]);

    servaddr.sin_port = htons(SERV_PORT);

    servaddr_len = sizeof(servaddr);

    while(fgets(sendline,1000,stdin) != NULL)
    {
        sendto(sockfd,sendline,strlen(sendline),0,(struct sockaddr *)&servaddr,sizeof(servaddr));

        n = recvfrom(sockfd,recvline,1000,0,(struct sockaddr *)&servaddr,&servaddr_len);

        recvline[n] = '\0';

        fputs("Message from the server is \n",stdout);

        fputs(recvline,stdout);
    }

    close(sockfd);

    return 0;

}
//udp 服务器
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>

#define SERV_PORT 5000

int main()
{
    int listen_fd,cliaddr_len, n, i;
    struct sockaddr_in servaddr, cliaddr;
    char sendline[100], recvline[100];

    listen_fd = socket(AF_INET,SOCK_DGRAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    bind(listen_fd,(struct sockaddr *)&servaddr,sizeof(servaddr));

    listen(listen_fd,100);

    cliaddr_len = sizeof(cliaddr_len);

    while(1)
    {
        n = recvfrom(listen_fd,recvline,sizeof(recvline),0,(struct sockaddr *)&cliaddr,&cliaddr_len);

        sendto(listen_fd,recvline,n,0,(struct sockaddr *)&cliaddr,cliaddr_len);


        for(i = 0;i < n - 1;i++)
        {
            recvline[i] = recvline[i] - 32;
        }

        recvline[n] = '\0';

        fputs("recvived following :\n",stdout);

        fputs(recvline,stdout);

    }

    close(listen_fd);
    
    return 0;
}

运行结果

 

 

  • 2
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

神仙难救丶啊

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值