【问题标题】:In this case, How do i use char pointer?(SOCKET Programming in windows)在这种情况下,如何使用 char 指针?(Windows 中的 SOCKET 编程)
【发布时间】:2016-05-15 00:33:44
【问题描述】:

代码下的注意事项

服务器.c

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

客户.c

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

我的计划是 char* 消息中的 SERVER.c 源 = "hel" 发送到 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();

}

【问题讨论】:

  • 这里参考其他socket程序相关问题。与指针相关的基本错误已在其他问题中介绍过。

标签: c sockets winsock tcp-ip winsock2


【解决方案1】:

客户端

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

您正在使用指向带有 bo 分配内存的指针的指针

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 终止符。然后你必须从服务器端发送它。

【讨论】:

  • 注意recv()的返回值就不需要发送空终止符了。它告诉您实际收到了多少字节。在处理字节时使用该数字并且不要超过它。例如,将数据传递给printf()时,也传递长度,那么您不需要空终止数据:printf("Server say &gt;&gt; %.*s", messageLen, message);
  • @RemyLebeau 好的,这是真的,但 OP 写了 printf("Server say &gt;&gt; %s", message); 需要一个 NULL 终止符。对于这种特定情况,真正使用char message[MAX_MSG_DIM] = {0}; an NULL 终止符已经在缓冲区内。我的意思是:我无法为 OP 编写所有可能的解决方案。我试图给他/她一些提示,以便开始更正其代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多