gpt4 book ai didi

c - 在这种情况下,我该如何使用char指针?(Windows中的SOCKET编程)

转载 作者:行者123 更新时间:2023-11-30 15:12:09 25 4
gpt4 key购买 nike

代码下注意

服务器.c

char* message = "hel";
send(clientsock, &message, 3, 0);

客户端.c

char** message = NULL;
messageLen = recv(clientsock, **message, 2, 0);

我的计划是 char* message = "hel"中的 SERVER.c 源发送到 char** 消息中的 CLIENT.c 源。但它不起作用,我对我的计划做了什么?

Server.c 完整源代码

#pragma comment(lib, "ws2_32.lib")
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <WinSock2.h>
#include <stdlib.h>

#define PORT 1234
#define BACKLOG 10



int main(int argc, char * argv[]) {

SOCKET sock, clientsock;
WSADATA wasData;
struct sockaddr_in sockinfo, clientinfo;
int clientsockSize;
char* message = "hel";


if (WSAStartup(MAKEWORD(2, 2), &wasData) != 0) { //int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
return 0;
}

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // socket( AF_INET , type , protocol)

if (sock == INVALID_SOCKET) {
return 1;
}

sockinfo.sin_family = AF_INET;
sockinfo.sin_port = htons(PORT); //
sockinfo.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(sock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR) { // int bind (sock , (SOCKADDR*)&sockinfo , sizeof(sockinfo)) if true : return 0, else -1
return 2;
}

if (listen(sock, BACKLOG) == SOCKET_ERROR) { // Int listen ( SOCKET , backlog )
return 3;
}


clientsockSize = sizeof(clientinfo);

printf("접속 대기중...\n");

clientsock = accept(sock, (SOCKADDR*)&clientinfo, &clientsockSize);


if (clientsock == INVALID_SOCKET) {
return 4;
}

printf("Send your message >> ");

send(clientsock, &message, sizeof(message), 0);

closesocket(sock);
closesocket(clientsock);

WSACleanup();

return -1;

}

CLIENT.c 完整源代码

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib, "ws2_32.lib")

#include <stdio.h>
#include <WinSock2.h>


int main(int argc, char* argv[]) {

SOCKET clientsock;
WSADATA wasData;
struct sockaddr_in sockinfo;

char** message = NULL;

int messageLen;

if (argc != 3) {
printf("Argument is not sufficient!\nInputed Argument >> %d", argc);
exit(1);
}

if (WSAStartup(MAKEWORD(2, 2), &wasData) != 0) {
printf("Error >> Init WSAStartup(..)\n");
}

clientsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientsock == INVALID_SOCKET)
printf("Error >> socket(..)\n");
memset(&sockinfo, 0, sizeof(sockinfo)); // 구조체 초기화

sockinfo.sin_family = AF_INET;
sockinfo.sin_port = htons(atoi(argv[2]));
sockinfo.sin_addr.s_addr = inet_addr(argv[1]);

if (connect(clientsock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR)
printf("Error >> connect(..)\n");

messageLen = recv(clientsock, **message, sizeof(message) - 1, 0);
if (messageLen == -1)
printf("Error >> recv(..)\n");

printf("Server say >> %s", message);
closesocket(clientsock);
WSACleanup();

}

最佳答案

客户端

您必须使用分配的缓冲区从套接字接收字符。

您正在使用指向已分配内存的指针的指针

char** message = NULL;

您必须使用

char message[MAX_MSG_DIM] = {0};

char *message = malloc(MAX_MSG_DIM);

请注意,当接收到所有字符时,recv 不会返回,而仅返回可用字符。这意味着要从客户端接收整个消息 recv 可以调用多个。您必须计算收到的字符以确定整个消息是否已到达。

服务器端

向您写的客户发送消息

send(clientsock, &message, sizeof(message), 0);

这是错误的。首先,您必须传递消息指针,其次,大小不是检索字符串长度的正确方法。您必须使用 strlen 来执行此操作。

send(clientsock, message, strlen(message)+1, 0);

我编写了 strlen(message)+1 ,因为在客户端,您没有在接收的缓冲区上添加 NULL 终止符。然后你必须从服务器端发送它。

关于c - 在这种情况下,我该如何使用char指针?(Windows中的SOCKET编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35217258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com