简单UDP服务器和客户端

简单udp服务器和客户端

server.c

#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define PRINT_ERR(msg)  \
    do {                \
        printf("%s:%s:%d\n", __FILE__, __func__, __LINE__); \
        perror(msg);    \
        exit(-1);        \
    } while (0)

int main(int argc, const char *argv[]) {
    if (argc < 3) {
        printf("please input ip , port\n");
        return -1;
    }
    int sfd;
    if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        PRINT_ERR("scoket create error");
    }
    struct sockaddr_in sockaddrIn;
    sockaddrIn.sin_port = htons(atoi(argv[2]));
    sockaddrIn.sin_family = AF_INET;
    sockaddrIn.sin_addr.s_addr = inet_addr(argv[1]);
    socklen_t socklen = sizeof(sockaddrIn);
    if (bind(sfd, (struct sockaddr*)&sockaddrIn, socklen) < 0) {
        PRINT_ERR("bind error");
    }
    struct sockaddr_in client_sockaddrIn;
    socklen_t client_socklen = sizeof(client_sockaddrIn);
    char buf[128] = {0};
    while (1) {
        memset(buf, 0, sizeof(buf));
        memset(&client_sockaddrIn, 0, sizeof(client_sockaddrIn));
        if (recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&client_sockaddrIn, &client_socklen) < 0) {
            PRINT_ERR("recv from error");
        }
        printf("client [%s: %d] message -->%s\n", inet_ntoa(client_sockaddrIn.sin_addr), htons(client_sockaddrIn.sin_port), buf);
        if (!strncmp(buf, "quit", 4)) {
            printf("client [%s: %d] exit!!!\n", inet_ntoa(client_sockaddrIn.sin_addr), htons(client_sockaddrIn.sin_port));
        }
        strcat(buf, "--hi!!!");
        sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&client_sockaddrIn, client_socklen);
    }
    return 0;
}

client.c

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

#define PRINT_ERR(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
                exit(-1);\
            }while(0)

int main(int argc, const char *argv[]) {
    if (argc < 3) {
        printf("please input ip , port\n");
        return -1;
    }
    int sfd;
    if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        PRINT_ERR("scoket create error");
    }
    struct sockaddr_in sockaddrIn;
    sockaddrIn.sin_port = htons(atoi(argv[2]));
    sockaddrIn.sin_family = AF_INET;
    sockaddrIn.sin_addr.s_addr = inet_addr(argv[1]);
    socklen_t socklen = sizeof(sockaddrIn);
    char buf[128] = {0};
    while (1) {
        memset(buf, 0, sizeof(buf));
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = '\0';

        if (sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sockaddrIn, socklen) < -1) {
            PRINT_ERR("send to error");
        }
        if (!strncmp(buf, "quit", 4)) {
            break;
        }
        memset(buf, 0, sizeof(buf));
        recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL);
        printf("receive server message --> %s\n", buf);
    }
    close(sfd);
    return 0;
}

运行结果

client

ubuntu:ubuntu $ ./client 192.168.10.126 8888
1
receive server message --> 1--hi!!!
nihao
receive server message --> nihao--hi!!!
quit
ubuntu:ubuntu $ 

server

ubuntu:ubuntu $ ./server 192.168.10.126 8888
client [192.168.10.126: 55724] message -->1
client [192.168.10.126: 55724] message -->nihao
client [192.168.10.126: 55724] message -->quit
client [192.168.10.126: 55724] exit!!!
^C
ubuntu:ubuntu $ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现TCP和UDP服务器客户非常简单。Qt提供了丰富的网络功能,可以轻松地创建和管理TCP和UDP连接。 要实现一个TCP服务器,首先需要创建一个QTcpServer对象,并监听一个特定的口。然后,使用QTcpServer的newConnection()信号连接一个槽函数,当有新的连接请求时,就会触发这个槽函数。在槽函数中,可以使用nextPendingConnection()函数接受连接,并创建一个QTcpSocket对象来处理与客户的通信。 要实现一个TCP客户,只需创建一个QTcpSocket对象,并调用connectToHost()函数来连接到服务器。一旦连接成功,就可以使用QTcpSocket的write()和read()函数来发送和接收数据。 要实现一个UDP服务器,需要创建一个QUdpSocket对象,并绑定到特定的口上。通过绑定完成后,可以通过readyRead()信号连接一个槽函数,在槽函数中使用readDatagram()函数来接收数据。 要实现一个UDP客户,只需创建一个QUdpSocket对象,并使用writeDatagram()函数来发送数据。对于接收数据,使用readyRead()信号连接一个槽函数,在槽函数中使用readDatagram()函数来接收数据。 无论是TCP还是UDP服务器客户,都需要处理网络连接的建立、断开、异常等情况。使用Qt的信号和槽机制,可以很方便地处理这些情况,并进行相应的操作。 总之,Qt提供了一个易于使用的网络编程框架,可以轻松实现TCP和UDP服务器客户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值