首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过send()recv(),Socket编程,C发送多个消息

通过send()和recv()函数,可以在Socket编程中实现C语言发送多个消息。

send()函数用于将数据发送到连接的另一端。它的原型如下:

代码语言:c
复制
int send(int sockfd, const void *buf, size_t len, int flags);

参数说明:

  • sockfd:表示连接的套接字描述符。
  • buf:指向要发送数据的缓冲区。
  • len:要发送的数据的字节数。
  • flags:可选参数,用于指定发送操作的行为。

recv()函数用于从连接的另一端接收数据。它的原型如下:

代码语言:c
复制
int recv(int sockfd, void *buf, size_t len, int flags);

参数说明:

  • sockfd:表示连接的套接字描述符。
  • buf:指向接收数据的缓冲区。
  • len:要接收的数据的最大字节数。
  • flags:可选参数,用于指定接收操作的行为。

在C语言中,可以通过循环调用send()函数来发送多个消息,接收端可以通过循环调用recv()函数来接收这些消息。具体的实现代码如下:

发送端:

代码语言:c
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888

int main() {
    int sockfd;
    struct sockaddr_in server_addr;

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(1);
    }

    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);

    // 连接服务器
    if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect");
        exit(1);
    }

    // 发送多个消息
    char* messages[] = {"Hello", "World", "How", "Are", "You"};
    int num_messages = sizeof(messages) / sizeof(messages[0]);

    for (int i = 0; i < num_messages; i++) {
        if (send(sockfd, messages[i], strlen(messages[i]), 0) < 0) {
            perror("send");
            exit(1);
        }
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

接收端:

代码语言:c
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define MAX_BUFFER_SIZE 1024

int main() {
    int sockfd, clientfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_addr_len;
    char buffer[MAX_BUFFER_SIZE];

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(1);
    }

    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 绑定套接字到服务器地址
    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind");
        exit(1);
    }

    // 监听连接请求
    if (listen(sockfd, 5) < 0) {
        perror("listen");
        exit(1);
    }

    printf("Server listening on port %d...\n", SERVER_PORT);

    // 接收连接请求
    client_addr_len = sizeof(client_addr);
    clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_addr_len);
    if (clientfd < 0) {
        perror("accept");
        exit(1);
    }

    printf("Client connected: %s\n", inet_ntoa(client_addr.sin_addr));

    // 接收多个消息
    int num_messages = 5;

    for (int i = 0; i < num_messages; i++) {
        memset(buffer, 0, sizeof(buffer));
        if (recv(clientfd, buffer, sizeof(buffer) - 1, 0) < 0) {
            perror("recv");
            exit(1);
        }
        printf("Received message: %s\n", buffer);
    }

    // 关闭套接字
    close(clientfd);
    close(sockfd);

    return 0;
}

以上代码演示了如何通过send()和recv()函数在C语言中实现发送多个消息的功能。在实际应用中,可以根据具体需求进行适当的修改和扩展。

相关搜索:第一次发送消息,为什么不能再次发送消息(Android Socket编程)当通过 Socket 发送数据时,send/write 什么时候返回 -1?使用C++通过socket发送键盘输入数据在Python中通过TCP发送/接收多个消息如何使用C++通过反向发送ConverseRequest消息C#通过Gmail编程发送电子邮件在ASP .NET中重试发送通过C#发送的失败消息尝试从arg通过ID发送直接消息时,出现“无法读取未定义的属性' send‘”如何在c sharp中同时通过tcp发送多个文件?C#:如何通过TCP向TCPListener发送用户名、时间和消息当命中服务器的端点时,如何通过socket连接从服务器发送消息?如何使用python通过套接字编程发送多个连续值(即视频帧、信号)在UDP实现中,"recvfrom“from pythons "socket”库无法找到通过以太网电缆成功发送的消息。能否在Python中通过socket编程访问IP摄像头PTZ端口,并向其发送十六进制字节?通过线程之间的环形(循环)缓冲区发送消息(在C中)通过c# .net核心中的套接字连接将图形QL查询作为消息发送如何使用C++套接字编程将数据并发发送到多个服务器?如何通过编程方式将多个文件从android发送到服务器node.js?如何在socket编程C++中使用snprintf的结果并从服务器端发送到客户端如果我不通过TCP套接字从server.c发送数据,为什么我自写dll中的C recv()函数甚至破坏了我的Labview程序
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux下Socket网络编程sendrecv使用注意事项

1.send函数 ssize_t send( SOCKET s, const char *buf, size_t len, int flags ); (1)send先比较待发送数据的长度len和套接字s...,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len; (3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完...(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回-1) (3)在Unix系统下,如果send...中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR。...如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

3K31

C++编程库与框架实战——ZeroMQ消息队列

在ZeroMQ中,消息通过Socket进行发送和接收的,ZeroMQ支持多种Socket类型。...ZeroMQ支持多种编程语言,包括C/C++、Java、Python等,这使得不同语言编写的应用程序之间可以互相通信,进而可以实现跨平台或者跨设备的数据传输。...4.消息队列构建:ZeroMQ可以用于构建高性能的消息队列机制,多个生产者可以向一个队列发送消息多个消费者可以从队列中取出消息进行处理。...发布者将消息发送到一个或多个主题,订阅者可以订阅特定的主题并接收消息。 3.异步队列模式(Push-Pull) Push端将消息推到队列中,Pull端从队列中取出消息进行处理。...zmq_recv:从套接字上接收消息。 zmq_poll:等待多个套接字上的事件。 zmq_msg_init:初始化空的zmq消息。 zmq_msg_send:往套接字上发送消息,支持更复杂的操作。

1K00
  • python3-socket黏包现象

    收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方, 使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块...int(s.recv(1024).decode('utf-8'))     s.send('recv_ready'.encode('utf-8'))     send_size=0     recv_size...:定制稍微复杂一点的报头 import os import json import struct import socket # ‪C:\Users\taoru\Desktop\Go语言编程_完整版_...) dic = {'filename':'Go语言编程_完整版_.pdf',        'filesize':os.path.getsize(r'C:\Users\taoru\Desktop\Go语言编程...(dic_len) conn.send(str_dic) with open(r'C:\Users\taoru\Desktop\Go语言编程_完整版_.pdf', 'rb') as f:     content

    53710

    Python网络编程Socket通信简单实现(文末赠书)

    Python的Socket编程中一般分为TCP和UDP两种通讯协议,而socket是基于C/S架构的,所以socket网络编程,需要编写客户端程序和服务端程序。...TCP通信流程 客户端流程 初始化socket() 使用ip和端口号connect()连接服务器 使用recv()接收数据,send()发送数据与服务器进行交互 关闭socket() 服务端流程 初始化...socket() 使用bind()绑定ip和端口号 使用listen()监听消息 获取客户端的套接字地址accept() 使用recv()接收数据,send()发送数据与客户端进行交互 关闭socket...() 在绑定端口上开启监听,参数表示最大等待建立连接的个数 accept() 等待客户端连接,连接后返回客户端地址 send(data) 发送数据,data 是二进制数据 recv(buffer) 表示接收数据...,如果服务端程序要和多个客户端通信,则可以使用多线程或者socketserver模块,socketserver是socket的再封装,从而简化socket网络编程的方法。

    4.6K10

    python实现单工、半双工、全双工聊天室

    s.recv(1024) s.send('exit') s.close() 此为最基础的基于TCP协议的聊天程序,实现了Socket编程的主要流程。...聊天室半双工实现: 半双工实现是连接建立以后,服务器等待客户端发送消息,客户端发送消息后等待接收服务器,这样一来一回循环往复下去。直到出现quit,关闭连接。...聊天室全双工(P2P)实现: 因为TCP连接是一个流,所以Socket模块的recv()是直到Scoket连接终断不会停止等待接受从另一端发送消息的。...客户端C也想加入AB的聊天,但是我们的服务端将CSocket对象覆盖掉了B的,于是B发送什么消息A都接受不到了,而A发的消息只有C能收到了。 这里通过广播(P2M)的形式解决。...聊天室全双工(P2M)实现: 这里稍微修改了P2P实现的服务端逻辑,不在将Socket连接一一对应,而是将所有的Socket连接存入一个列表,每当一个客户端发送消息,服务端就将这段消息广播给所有的客户端

    1.7K10

    网络编程socket 编程

    socket 编程 -客户端/服务器架构 :即 C/S架构 1,硬件C/S 架构(打印机) 2, 软件C/S 架构(web服务) C/S架构与socket的关系:socket就是为了完成C/S架构的开发...-基于网络类型的套接字家族 AF_INET 用于网络编程 通过网络来实现2个程序通讯 socket 基于tcp运行流程图如下: 例如: 服务端: import socket phone = socket.socket...) 运行结果是: 服务端:客户端发来的消息是 b’hello’ 客户端:收到服务端发来的消息 b’HELLO’ socket 底层工作原理 客户端服务端循环发送接收消息 服务端代码: from socket...(client_msg.encode('utf-8')) print('客户端已发送消息') data = tcp_client.recv(buffer_size) print('收到服务端发来的消息...socket 收发消息原理刨析 客户端发消息:是从应用程序发送到用户态内存,然后发送到内核态内存然后再通过网卡发出 客户端消息:是从网卡进入内核态内存然后发送到用户态内存 服务端同样如此。

    2.7K50

    3.网络编程 网络编程

    就在此时,突然灵感来了,我可以通过qq、云盘、微信等发送给他啊,可是人家说了,让你用自己写的程序啊,嗯,这是个问题,此时又来一个灵感,我给他发送文件肯定是通过网络啊,这就产生了网络,对吧,那我怎么让我的程序能够通过网络来联系到我的朋友呢...,并且把文件发送给他呢,那么查了一下,发现网络通信通过socket可以搞,但是怎么搞呢?...知道为什么要学习socket了吧朋友们而你使用自己的电脑和别人的电脑进行联系并发送消息或者文件等操作就叫做网络通信。...服务器端先初始化Socket,然后与端口绑定(bind),recvform接收消息,这个消息有两项,消息内容和对方客户端的地址,然后回复消息时也要带着你收到的这个客户端的地址,发送回去,最后关闭连接,一次交互结束...网络编程的作业   好了同学们,到了这儿,我们的网络编程socket就讲完了,大致就是这些内容,给大家留个作业:(你的努力的成果你自己是看的到的~!)

    2.5K21

    网络编程-SOCKET开发

    网络编程-SOCKET开发 网络编程架构分类 B/S架构        B指的是web(网页),S指的是Server(服务端软件) C/S架构        C指的是Client(客户端软件),S指的是...(ret) break else: print(ret) receive.close() 公共用途的socket函数: s.recv() 接收数据 s.send...() 发送数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完,可后面通过实例解释) s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时...              首先,黏包现象只出现在TCP传输中,由于某些原因经过TCP连续发送的信息在很短的时间内某个阶段粘连在一起发送,接收方接收到的是一条消息。     ...在发送端由于两条消息发送的间隔时间很短,且两条消息本身也很短,在发送之前被合成了一条消息。 2. 在接收端由于接收不及时导致两条先后到达的信息在接收端黏在了一起。

    45420

    粘包现象_光柱现象

    粘包现象 当多条消息发送时接受变成了一条或者出现接收不准确的情况 粘包现象会发生在发送端 两条消息间隔时间短,长度短 就会把两条消息发送之前就拼在一起 节省每一次发送消息回复的网络资源 粘包现象会发生在接收端...多条消息发送到缓存端,但没有被及时接收,或者接收的长度不足一次发送的长度 数据与数据之间没有边界 本质 : 发送的每一条数据之间没有边界 – 例: import socket sk = socket.socket...('i', len_msg) # 把字节的长度编程4字节,i代表int conn.send(proto_len) conn.send(msg) sk = socket.socket(...(msg1) proto_send(msg2) # 计算要发送的数据字节长度 # 把字节的长度编程4字节 # 发送4字节 # 发送数据 # 通过socket的tcp协议上传文件 client端: import...struct import socket sk = socket.socket() def proto_recv(): len_msg = sk.recv(4) len_msg =

    17420

    Python升级之路( Lv16 ) 网络编程

    通过端口,可以在一个主机上运行多个网络应用程序。. 端口的表示是一个16位的二进制整数,对应十进制的0-65535, 操作系统中一共提供了0~65535可用端口范围....Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程两类 socket()函数介绍 在Python语言标准库中,通过使用socket模块提供的socket对象,.... flag提供有关消息的其他信息,通常可以忽略s.send()发送TCP数据,将string中的数据发送到连接的套接字....非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常.s.makefile()创建一个与该套接字相关连的文件 2....等待socket连接 tcp.send("客户端发送消息".encode("utf-8")) # 4.

    84820

    嵌入式Linux中间件-ZeroMQ

    ZeroMQ:ZeroMQ是一个轻量级的消息队列库,它允许应用程序通过不同的通信模式进行消息传递。它可以在不同的进程或计算机之间进行通信,支持多种编程语言。...客户端发送一个请求消息给服务器,并等待服务器的响应。服务器接收请求消息,并发送一个响应消息给客户端。 2. 发布-订阅模式(PUB-SUB):在这种模式下,消息发布者将消息广播给所有订阅者。...socket.send(request, zmq::send_flags::none); zmq::message_t reply; socket.recv(reply, zmq::recv_flags...Server.cpp创建一个REP类型的socket,并绑定到"tcp://*:5555"地址上。在服务器的无限循环中,它接收来自客户端的请求消息,然后发送一个回复消息。...Client.cpp创建一个REQ类型的socket,并连接到"tcp://localhost:5555"。客户端发送一个请求消息给服务器,并等待服务器的响应。

    35510

    UDP&TCP Linux网络应用编程详解

    2.Linux网络编程基础 2.1 嵌套字 多个TCP连接或者多个应用程序进程 可能需要同一个TCP端口传输数据。...Linux中的网络编程正是通过Socket接口实现的,Socket是一种文件描述符。...(net)字符顺序转换成主机(host)字符顺序; netshort:待转换的32位网络字符顺序数 返回值: 返回对应的主机字符顺序数; 3.TCP TCP有专门的传递保证机制,收到数据时会自动发送确认消息...,发送方收到确认消息后才会继续发送消息,否则继续等待。...关闭socket exit(0); 为了应对多个连接,并保证它们之间相互独立,实际编程中往往还要加入多进程fork()。让子进程接收数据,父进程继续监听新的连接。 客户机端: a.

    5.7K20

    python基础之socket编程

    python基础之socket编程 一 TCP/IP五层模型 在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。...所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。   ...收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,...'.encode('utf-8')) s.send('feng'.encode('utf-8')) 接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据...ack=0,则重新发送数据,所以tcp是可靠的 而udp发送数据,对端是不会返回确认信息的,因此不可靠 补充问题二:send(字节流)和recv(1024)及sendall recv里指定的1024意思是从缓存里一次拿出

    2.9K100

    Python—socket编程

    一、何为socket编程 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。...3.发送的数据如果没有编码的话,默认只能发送字节类型的数据。 三、如何使用UDP套接字又接收又发送消息呢?...如果我们想要使用udp套接字又发送消息又接收消息的话,我们可以定义一个发送消息的函数和一个接收消息的函数,其余部分可以在主函数当中完成。...ip地址发送数据 2.要绑定一个ip地址来接收发送的数据 ''' def sendaddr(udp_socket): send_addr = ("169.254.190.219",9999)...tcp_client.send(send_content.encode("gbk")) # # # 接收数据 # recv_data = tcp_client.recv(1024) #

    35910

    Python—socket编程

    一、何为socket编程 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。...3.发送的数据如果没有编码的话,默认只能发送字节类型的数据。 三、如何使用UDP套接字又接收又发送消息呢?...如果我们想要使用udp套接字又发送消息又接收消息的话,我们可以定义一个发送消息的函数和一个接收消息的函数,其余部分可以在主函数当中完成。...地址发送数据 2.要绑定一个ip地址来接收发送的数据 ''' def sendaddr(udp_socket): send_addr = ("169.254.190.219",9999)...tcp_client.send(send_content.encode("gbk")) # # # 接收数据 # recv_data = tcp_client.recv(1024) #

    41410

    面向对象多继承和网络编程

    二丶网络编程   1.软件     客户端:CS架构,client --> server     浏览器:BS架构,browser -->server   2.如何实现相互通信        1.可以编写两个软件...data = conn.recv(1024) print('已经有人发来消息了',data) # 服务端通过连接对象给客户端回复了一个消息。...client.connect(('192.168.13.220',8000)) # # 链接上服务端后,向服务端发送消息 client.send(b'hello') # 王晓东等待服务端给他发送消息 data...= client.recv(1024) print(data) # 关闭自己 client.close() 客户端 结果:   当客户端跟服务器端相互交换完数据后:   客户端:     为什么要网络通信发送的是字节...Python3:  send/recv都是字节       Python2:  send/recv都是字符串     服务端:       accept:阻塞,等待客户端来连接       recv:

    30020
    领券