最简单的c代码tcp 发送接受程序

最简单的c代码tcp 发送接受程序
/* server.c
 * 创建一个socket
 * 绑定上自己的地址
 * 然后就开始侦听客户端连接了.
 * 有客户接入, 首先accept, 得到一个新的fd,
 * 在这个新的fd上进行发送和接受
 */
 
/* tcp_send.c
 * 创建一个socket
 * 构建服务器地址 serv_addr
 * 然后通过socket与服务器建立连接connect
 * 然后就可以收发数据了. send,recv
 * 需要在结束时关闭socket (close) 
 */

具体代码如下: server.c

#include <netinet/in.h>  // for sockaddr_in, htons, INADDR_ANY, in_addr
#include <stdio.h>       // for perror, printf
#include <string.h>      // for memset, strcpy, strlen
#include <sys/socket.h>  // for accept, bind, listen, recv, send, socket
#include <unistd.h>      // for close

/* server.c
 * 创建一个socket
 * 绑定上自己的地址
 * 然后就开始侦听客户端连接了.
 * 有客户接入, 首先accept, 得到一个新的fd,
 * 在这个新的fd上进行发送和接受
 */
int main() {
 
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
 
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(1234);
 
    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    listen(sockfd, 5);
 
    char buffer[1024];
    while (1) {
        struct sockaddr_in client_addr;
        socklen_t client_len = sizeof(client_addr);
        int connfd = accept(sockfd, (struct sockaddr *) &client_addr, &client_len);
        if (connfd < 0) {
            perror("accept");
            continue;
        }
 
        int n = recv(connfd, buffer, 1024, 0);
        if (n == -1) {
            perror("recv");
            continue;
        }
 
        printf("Received: %s\n", buffer);
 
        strcpy(buffer, "Hello, client!");
        n = send(connfd, buffer, strlen(buffer), 0);
        if (n == -1) {
            perror("send");
            continue;
        }
 
        close(connfd);
    }
 
    close(sockfd);
    return 0;
}

tcp 客户端代码. tcp_send.c

#include <arpa/inet.h>   // for inet_pton
#include <netinet/in.h>  // for sockaddr_in, htons
#include <stdio.h>       // for perror, fprintf, printf, stderr
#include <stdlib.h>      // for exit
#include <string.h>      // for strcpy, strlen
#include <strings.h>     // for bzero
#include <sys/socket.h>  // for AF_INET, connect, recv, send, socket, SOCK_S...
#include <unistd.h>      // for close

/* tcp_send.c
 * 创建一个socket
 * 构建服务器地址 serv_addr
 * 然后通过socket与服务器建立连接connect
 * 然后就可以收发数据了. send,recv
 * 需要在结束时关闭socket (close) 
 */
int main(int argc, char *argv[]) {
 
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <hostname>\n", argv[0]);
        exit(1);
    }
 
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

	//建立服务器地址
    struct sockaddr_in serv_addr;
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(1234); //向1234端口发送
    if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {
        fprintf(stderr, "Invalid address\n");
        exit(1);
    }

	//与服务器建立连接,3次握手
    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("connect");
        exit(1);
    }
 
    char buffer[1024];
    strcpy(buffer, "Hello, server!");
	//发送数据, 已经connect了,就不用带服务器地址了.
    int n = send(sockfd, buffer, strlen(buffer), 0);
    if (n == -1) {
        perror("send");
        exit(1);
    }
    //接受数据
    n = recv(sockfd, buffer, 1024, 0);
    if (n == -1) {
        perror("recv");
        exit(1);
    }
 
    printf("Received: %s\n", buffer);
 
    close(sockfd);
    return 0;
}

结果展示:
 ./tcp_send 127.0.0.1
Received: Hello, client!

 ./server
Received: Hello, server!
Received: Hello, server!
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问。我可以向您介绍一些关于 C 语言编写 Modbus TCP 客户端通讯程序代码解析程序的知识。 首先,Modbus 是一种通信协议,通常用于工业自动化领域的设备通信。而 Modbus TCP 则是基于 TCP/IP 协议的 Modbus 扩展,可以实现在网络上的设备通信。因此,编写 Modbus TCP 客户端程序需要使用 TCP/IP 协议栈,以及 Modbus 协议的相关函数库。 以下是一个编写 Modbus TCP 客户端通讯程序的基本步骤: 1. 建立连接:使用 socket 函数创建套接字,并使用 connect 函数连接 Modbus TCP 服务器。 2. 构造请求:根据 Modbus 协议规范,构造读取或写入数据的请求报文。 3. 发送请求:使用 send 函数将请求报文发送给 Modbus TCP 服务器。 4. 接收响应:使用 recv 函数从服务器接收响应报文。 5. 解析响应:根据 Modbus 协议规范,解析响应报文中的数据,并进行相应处理。 以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define SERVER_IP "192.168.1.1" #define SERVER_PORT 502 #define FC_READ_COILS 0x01 #define FC_READ_INPUTS 0x02 #define FC_READ_HOLD_REGS 0x03 #define FC_READ_INPUT_REGS 0x04 #define FC_WRITE_SINGLE_COIL 0x05 #define FC_WRITE_SINGLE_REG 0x06 typedef struct { unsigned short tid; unsigned short pid; unsigned short len; unsigned char uid; unsigned char fun; } mbap_t; typedef struct { unsigned char code; union { struct { unsigned short addr; unsigned short count; } read_coils, read_inputs, read_hold_regs, read_input_regs; struct { unsigned short addr; unsigned short value; } write_single_coil, write_single_reg; } pdu; } modbus_req_t; typedef struct { unsigned char code; unsigned short len; unsigned char data[256]; } modbus_resp_t; int main() { int sockfd; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); exit(EXIT_FAILURE); } mbap_t mbap; modbus_req_t req; modbus_resp_t resp; memset(&mbap, 0, sizeof(mbap)); memset(&req, 0, sizeof(req)); memset(&resp, 0, sizeof(resp)); mbap.tid = rand(); mbap.len = htons(sizeof(req)); req.code = FC_READ_HOLD_REGS; req.pdu.read_hold_regs.addr = htons(0); req.pdu.read_hold_regs.count = htons(1); send(sockfd, &mbap, sizeof(mbap), 0); send(sockfd, &req, sizeof(req), 0); recv(sockfd, &mbap, sizeof(mbap), 0); recv(sockfd, &resp, sizeof(resp), 0); if (resp.code == req.code) { unsigned short value = ntohs(*(unsigned short *)(resp.data)); printf("Value: %d\n", value); } else { printf("Error: %d\n", resp.code); } close(sockfd); return 0; } ``` 这段代码使用了套接字函数库和 Modbus 协议的相关函数库。在主函数中,首先创建了一个套接字,然后初始化了服务器地址和请求报文的各个字段。接着,通过调用 send 函数将请求报文发送给 Modbus TCP 服务器,并通过调用 recv 函数接收响应报文。最后,根据响应报文的返回值进行相应处理。 需要注意的是,这只是一个简单的示例代码,实际开发中还需要考虑异常情况的处理和代码的稳定性等问题。 希望这段代码能够帮助您理解 C 语言编写 Modbus TCP 客户端通讯程序代码解析程序的基本方法。如果您有任何问题或疑问,欢迎随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值