C语言用动态内存创建的存储空间用TCP的send发送后接收端接收到了,但没有显示内容,发送前printf后却在接收端可以正常显示
时间: 2024-04-04 12:33:58 浏览: 18
这可能是由于发送的数据包大小超过了TCP协议的最大限制,导致数据被分成多个数据包发送,但是接收端没有将这些数据包合并起来,而是分别接收了每个数据包,导致数据显示不完整或者显示为空。你可以尝试将发送数据的大小限制在TCP协议的最大限制内,或者在接收端对接收到的数据进行合并处理,以保证数据的完整性和正确性。此外,你还可以在发送数据前将数据进行压缩或者加密处理,以减小数据包的大小,提高数据传输效率。
相关问题
C语言编写一对一服务器客户端的应用程序,客户端使用TCP/UDP向服务器端发送请求日期和时间,服务器端在收到请求后,回答请求并显示出客户的地址
好的,下面是C语言实现。
服务器端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define PORT 8000
#define BUFFER_SIZE 1024
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
char buffer[BUFFER_SIZE];
time_t t;
struct tm *now;
// 创建TCP socket对象
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("创建socket失败");
exit(EXIT_FAILURE);
}
// 绑定服务器IP和端口
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("绑定失败");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 1) == -1) {
perror("监听失败");
exit(EXIT_FAILURE);
}
printf("服务器启动,等待客户端连接...\n");
while (1) {
// 接受客户端连接
socklen_t client_addr_len = sizeof(client_addr);
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_fd == -1) {
perror("接受客户端连接失败");
continue;
}
printf("客户端 %s:%d 连接成功!\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接收客户端请求
memset(buffer, 0, BUFFER_SIZE);
if (recv(client_fd, buffer, BUFFER_SIZE, 0) == -1) {
perror("接收数据失败");
close(client_fd);
continue;
}
printf("客户端 %s:%d 请求日期时间:%s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);
// 处理请求
time(&t);
now = localtime(&t);
strftime(buffer, BUFFER_SIZE, "当前时间为:%Y-%m-%d %H:%M:%S,客户端地址为:%s:%d", &now);
// 发送响应
if (send(client_fd, buffer, strlen(buffer), 0) == -1) {
perror("发送数据失败");
}
// 关闭连接
close(client_fd);
}
return 0;
}
```
客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8000
#define BUFFER_SIZE 1024
int main() {
int client_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建TCP socket对象
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
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("127.0.0.1");
server_addr.sin_port = htons(PORT);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("连接失败");
exit(EXIT_FAILURE);
}
// 发送请求
char *request = "请求日期时间";
if (send(client_fd, request, strlen(request), 0) == -1) {
perror("发送数据失败");
exit(EXIT_FAILURE);
}
// 接收响应
memset(buffer, 0, BUFFER_SIZE);
if (recv(client_fd, buffer, BUFFER_SIZE, 0) == -1) {
perror("接收数据失败");
exit(EXIT_FAILURE);
}
printf("服务器响应:%s\n", buffer);
// 关闭连接
close(client_fd);
return 0;
}
```
当客户端运行时,它会连接到服务器并发送请求。服务器接收请求后,会返回当前日期时间和客户端地址。注意,这里使用的是TCP协议,如果要使用UDP协议,需要将socket类型改为SOCK_DGRAM,并且不需要建立连接。
用C语言与Winsock完成一对多Socket客户端和用户端程序,消息发送与接收不会阻塞,同时支持多个用户端
实现一对多通信需要使用TCP/IP协议,Winsock库提供了相应的API函数来实现网络通信。以下是一个简单的基于Winsock的TCP/IP客户端和服务器端程序的示例代码,可以实现多个客户端连接到服务器并发送消息,同时服务器可以向所有客户端广播消息。
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //加载 ws2_32.dll
#define PORT 8888 //服务器监听端口号
int main()
{
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
SOCKADDR_IN serverAddr, clientAddr;
int addrLen = sizeof(SOCKADDR_IN);
char recvBuf[1024];
int recvLen;
char sendBuf[1024];
int sendLen;
int i;
int clientCount = 0;
SOCKET clientSockets[10];
//初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
printf("socket failed!\n");
WSACleanup();
return 1;
}
//绑定套接字到本地地址和端口
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(PORT);
if (bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("bind failed!\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
//监听连接请求
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("listen failed!\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Server started, waiting for clients...\n");
while (1)
{
//接受连接请求
clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET)
{
printf("accept failed!\n");
continue;
}
//将客户端套接字加入数组
clientSockets[clientCount] = clientSocket;
clientCount++;
//打印客户端地址和端口号
printf("Client %s:%d connected.\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
//向所有客户端广播有新客户端连接
sprintf(sendBuf, "Client %s:%d connected.", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
for (i = 0; i < clientCount - 1; i++)
{
sendLen = send(clientSockets[i], sendBuf, strlen(sendBuf) + 1, 0);
}
}
//关闭所有客户端套接字
for (i = 0; i < clientCount; i++)
{
closesocket(clientSockets[i]);
}
//关闭服务器套接字
closesocket(serverSocket);
//清理Winsock库
WSACleanup();
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //加载 ws2_32.dll
#define SERVER_IP "127.0.0.1" //服务器IP地址
#define PORT 8888 //服务器监听端口号
int main()
{
WSADATA wsaData;
SOCKET clientSocket;
SOCKADDR_IN serverAddr;
char recvBuf[1024];
int recvLen;
char sendBuf[1024];
int sendLen;
//初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET)
{
printf("socket failed!\n");
WSACleanup();
return 1;
}
//连接到服务器
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(PORT);
if (connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("connect failed!\n");
closesocket(clientSocket);
WSACleanup();
return 1;
}
//向服务器发送消息
sprintf(sendBuf, "Hello from client %d.", GetCurrentProcessId());
sendLen = send(clientSocket, sendBuf, strlen(sendBuf) + 1, 0);
//接收服务器消息
recvLen = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
printf("Received from server: %s\n", recvBuf);
//关闭套接字
closesocket(clientSocket);
//清理Winsock库
WSACleanup();
return 0;
}
```
以上代码只是基础示例,还需要进行错误处理和优化。同时如果要支持多个客户端,可以使用线程或者IOCP模型来处理多个客户端的连接和消息传输。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)